jueves, febrero 27, 2020

Calendario con horas en Power Query

Ya he mencionado que mi abuelita solía decir que cuando tenemos un martillo todo problema se parece a un clavo. Power Query es mi "martillo" a la hora de resolver un problema de transformación de datos en Excel.

El "clavo" de turno era crear un calendario, similar al del post anterior, pero con horas. Es decir un fila para cada hora de cada día. En lugar de 365 o 366 filas, 8760 o 8784 si el año es bisiesto.

El método es similar al del post mencionado pero con ciertos cambios. Como queremos que nuestra solución sea dinámica, empezamos por definir un conexión a una celda donde ponemos el año para el cual queremos crear el calendario



Esta consulta la guardamos como "solo conexión" (ver el post anterior). El código es


 let  
   Origen = Excel.CurrentWorkbook(){[Name="year"]}[Content],  
   #"Tipo cambiado" = Table.TransformColumnTypes(Origen,{{"Column1", Int64.Type}}),  
   Column1 = #"Tipo cambiado"{0}[Column1]  
 in  
   Column1  


De hecho hemos creado una variable que usaremos en el código que creará el calendario. A diferencia de lo que hacemos habitualmente, no empezamos por importar datos de una tabla u otra fuente. Abrimos una consulta en blanco y en el editor avanzado ponemos este código:

 let  
   startdate = DateTime.From(#datetime(year,1,1,0,0,0)),  
   count = if Date.IsLeapYear(startdate) then 366*24 else 365*24,  
   Origen = List.DateTimes(startdate,count,#duration(0,1,0,0)),  
   #"Convertida en tabla" = Table.FromList(Origen, Splitter.SplitByNothing(), null, null, ExtraValues.Error),  
   #"Dividir columna por delimitador" = Table.SplitColumn(Table.TransformColumnTypes(#"Convertida en tabla",   
     {{"Column1", type text}}), "Column1", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Column1.1", "Column1.2"}),  
   #"Tipo cambiado" = Table.TransformColumnTypes(#"Dividir columna por delimitador",{{"Column1.1", type date}, {"Column1.2", type time}}),  
   #"Columnas con nombre cambiado" = Table.RenameColumns(#"Tipo cambiado",{{"Column1.1", "Fecha"}, {"Column1.2", "Hora"}})  
 in  
   #"Columnas con nombre cambiado"  

El resultado es el siguiente


En este caso usamos la función List.DateTimes que crea una lista (columna) de fechas con horas (el tipo de datos datetime). Para el "salto" usamos #duration(0,1,0,0), para indicar que el salto es por hora.

El archivo se puede descargar aquí.

No hay comentarios.:

Publicar un comentario

Nota: sólo los miembros de este blog pueden publicar comentarios.