martes, 13 de noviembre de 2018

Power Query: funciones M tipo fecha.

Aprenderemos hoy algunas de las funciones M de Power Query más habituales en cuanto a trabajar con fechas.
En concreto listaré:
Date.EndOfMonth(["Campo Fecha"]): devuelve la fecha del último día del mes de la fecha informada.

Date.DaysInMonth(["Campo Fecha"]): devuelve el número de días del mes de la fecha dada.

Date.StartOfWeek(["Campo Fecha"]): vemos el primer día de la semana (lunes por defecto), pero con un segundo parámetro en la función
Day.Sunday = 0
Day.Monday = 1
Day.Tuesday = 2
Day.Wednesday = 3
Day.Thursday = 4
Day.Friday = 5
Day.Saturday = 6
podemos dirigirlo al día deseado.

Date.EndOfWeek(["Campo Fecha"]): similar a la función anterior. Vemos el último día de la semana.

Date.WeekOfMonth(["Campo Fecha"]): número de la semana dentro de un mes, esto semana 1, 2, 3, 4 o 5 del mes.

Date.WeekOfYear(["Campo Fecha"]): número de la semana del año.

y un muy largo etcétera... de hecho, hay muchísimas más posibilidades de trabajar con funciones de fecha en Power Query (en su lenguaje M) que directamente en la hoja de cálculo con las funciones estándar de Excel.


Veamos algunos ejemplos a partir de un listado de fechas:

Power Query: funciones M tipo fecha.


Comenzamos cargando la tabla al editor de consultas de Power Query.
Desde la Ficha Datos > grupo Obtener y transformar > Desde una tabla, y ya en el editor de consultas, por estética, cambiamos el tipo de dato a tipo Fecha (Date) en lugar de Fecha/Hora.


Ahora podemos ir añadiendo nueva columnas personalizadas desde la ficha de Agregar columna, y en ella hacer uso de las funciones comentadas.

por ejemplo, añadimos una nueva columna para obtener el último día del mes...
=Date.EndOfMonth([Campo Fecha])

Power Query: funciones M tipo fecha.



Así podríamos añadir el resto de funciones comentadas
=Date.DaysInMonth([Campo Fecha])
=Date.StartOfWeek([Campo Fecha])
=Date.EndOfWeek([Campo Fecha])
=Date.WeekOfMonth([Campo Fecha])
=Date.WeekOfYear([Campo Fecha])


Una alternativa más simple consistiría es ir duplicando el '[Campo fecha]' y luego haciendo clic derecho sobre ese nuevo campo duplicado buscar la opción de Transformar... lo que nos ofrece categorizado (Año, Trimestre, Mes, Semana y Día) la gran mayoría de funciones de fecha.

Power Query: funciones M tipo fecha.


Esta opción es muy simple y no requiere ningún tipo de conocimiento del lenguaje y funciones M de Power Query.. tan solo algo de paciencia.

Finalmente una alternativa más sería acceder al Editor avanzado de la consulta y escribir todo el código necesario:
let
Source = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Campo Fecha", type date}}),

#"Fin_mes" = Table.AddColumn(#"Changed Type", "Fin de mes", each Date.EndOfMonth([#"Campo Fecha"]), type date),

#"Dias_mes" = Table.AddColumn(#"Fin_mes", "Días mes", each Date.DaysInMonth([#"Campo Fecha"]), Int64.Type),

#"Inicio_semana" = Table.AddColumn(#"Dias_mes", "Inicio semana", each Date.StartOfWeek([#"Campo Fecha"]), type date),

#"Fin_semana" = Table.AddColumn(#"Inicio_semana", "Fin semana", each Date.EndOfWeek([#"Campo Fecha"]), type date),

#"Semana_mes" = Table.AddColumn(#"Fin_semana", "Semana mes", each Date.WeekOfMonth([#"Campo Fecha"]), Int64.Type),

#"Semana_año" = Table.AddColumn(#"Semana_mes", "Semana año", each Date.WeekOfYear([#"Campo Fecha"]), Int64.Type)

in
#"Semana_año"


Esto nos permite ajustar el número de líneas / acciones del código de nuestra consulta, así como personalizar más ágilmente los tipos de datos de los campos o, simplemente, los nombres elegidos para estas nuevas columnas.

El resultado buscado quedaría:

Power Query: funciones M tipo fecha.

4 comentarios:

  1. Buenas tardes, estoy tratando de obtener de la columna fecha todos los registros que sean anteriores al día actual, pero no lo consigo agradezco si me pueden ayudar, tengo lo siguiente:

    if [FECHA] <= today then [FECHA] else ""

    He tratado también con "now, date" pero no lo logro...

    ResponderEliminar
    Respuestas
    1. Hola!
      prueba con
      DateTime.LocalNow()

      a ver si funciona mejor...

      Saludos

      Eliminar
    2. Hola, tienes la razon los he conseguido asi por si alguien más lo necesita:
      if [FECHA] < DateTime.Date(DateTime.LocalNow()) then [FECHA] else ""

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.