MJC1
Hola, asistentes de Power BI,
Soy nuevo en Power BI y estoy tratando de crear algunos informes basados en datos de energía de medidores inteligentes.
Los datos son prácticamente una serie de tiempo con una marca de tiempo del siguiente formato «01/01/2017 15:30:00″.
Para cada marca de tiempo habrá un valor de energía correspondiente. Mis datos ingresan cada media hora, por lo que para una serie temporal anual habrá 17520 marcas de tiempo.
Me gustaría generar un informe en Power BI que incluya el siguiente gráfico: Eje X: Media hora (para un solo día del año. Insertaré una segmentación para que el usuario pueda elegir el día del año de interés) y Eje Y: energía.
Para tener varias dimensiones de fecha en Power BI, estoy usando el script estándar a continuación en una consulta de Power BI. El script es estándar y aparece en todas partes en la web. (https://pastebin.com/vxRc4AnU)
He intentado modificar este script para incluir la dimensión de tiempo (es decir, hora, media hora, minuto) en esta tabla de fechas, pero me cuesta hacerlo. No lo estoy haciendo bien. Esto se debe a que soy bastante inexperto con esto.
Me gustaría preguntarle amablemente si podría dar una mano rápida para resolver esto. ¿Qué líneas de código necesito agregar en el siguiente código para incluir el ¿Dimensión de tiempo (es decir, hora, media hora, minuto) en esta tabla de fechas? Agradecido si me pudieras ayudar en esto. Muchas gracias por adelantado.
let fnDateTable = (StartDate como fecha, EndDate como fecha, Cultura opcional como texto anulable) as table =>
dejar
DayCount = Duración.Días(Duración.Desde(FechaFinal – FechaInicio))+1,
Fuente = List.Dates(StartDate,DayCount,#duration(1,0,0,0)),
TableFromList = Table.FromList(Fuente, Splitter.SplitByNothing()),
ChangedType = Table.TransformColumnTypes(TableFromList,{{«Column1», escriba fecha}}),
RenamedColumns = Table.RenameColumns(ChangedType,{{«Column1», «Date»}}),
InsertYear = Table.AddColumn(RenamedColumns, «Year», each Date.Year([Date]),teclee el texto),
InsertQuarterNum = Table.AddColumn(InsertYear, «Quarter Num», each Date.QuarterOfYear([Date])),
InsertarCuarto = Table.AddColumn(InsertQuarterNum, «Quarter», cada «Q» & Number.ToText([Quarter Num])),
InsertMonth = Table.AddColumn(InsertQuarter, «Month Num», each Date.Month([Date]), teclee el texto),
InsertStartOfMonth = Table.AddColumn(InsertMonth, «StartOfMonth», each Date.StartOfMonth([Date]), escriba la fecha),
InsertarFinDeMes = Tabla.AgregarColumna(InsertarInicioDeMes, «FinDeMes», cada Fecha.FinDeMes([Date]), escriba la fecha),
InsertDay = Table.AddColumn(InsertEndOfMonth, «DayOfMonth», each Date.Day([Date])),
InsertDayInt = Table.AddColumn(InsertDay, «DateInt», each [Year]*10000 + [Month Num]*100 + [DayOfMonth]),
InsertMonthName = Table.AddColumn(InsertDayInt, «Mes», cada Fecha.ToText([Date], «MMMM», Cultura), escriba texto),
InsertShortMonthName = Table.AddColumn(InsertMonthName, «Month short», each Date.ToText([Date], «MMM», Cultura), escriba texto),
InsertCalendarMonth = Table.AddColumn(InsertShortMonthName, «Month Year», each [Month short]& » » & Número.AlTexto([Year]),teclee el texto),
InsertCalendarQtr = Table.AddColumn(InsertCalendarMonth, «Quarter Year», each «Q» & Number.ToText([Quarter Num]) & » » & Número.AlTexto([Year]), teclee el texto),
InsertDayWeek = Table.AddColumn(InsertCalendarQtr, «Weekday Num», each Date.DayOfWeek([Date])),
InsertDayName = Table.AddColumn(InsertDayWeek, «Weekday», each Date.ToText([Date], «dddd», Cultura), escriba texto),
InsertShortDayName = Table.AddColumn(InsertDayName, «Weekday short», each Date.ToText([Date], «ddd», Cultura), escriba texto),
InsertWeekEnding = Table.AddColumn(InsertShortDayName , «EndOfWeek», each Date.EndOfWeek([Date]), escriba la fecha),
InsertWeekNumber= Table.AddColumn(InsertWeekEnding, «Week Num», each Date.WeekOfYear([Date])),
InsertMonthWeekNumber= Table.AddColumn(InsertWeekNumber, «WeekOfMonth Num», each Date.WeekOfMonth([Date])),
InsertMonthnYear = Table.AddColumn(InsertMonthWeekNumber,»Month-YearOrder», each [Year]*10000 + [Month Num]*100),
InsertarAñoCuaternario = Table.AddColumn(InsertMonthnYear,»Quarter-YearOrder», each [Year]*10000 + [Quarter Num]*100),
ChangedType1 = Table.TransformColumnTypes(InsertQuarternYear,{{«Quarter-YearOrder», Int64.Type},{«Week Num», Int64.Type},{«WeekOfMonth Num», Int64.Type},{«Quarter», type text },{«Año», escriba texto},{«OrdenMes-Año», Int64.Type}, {«DateInt», Int64.Type}, {«DayOfMonth», Int64.Type}, {«Month Num», Int64 .Type}, {«Quarter Num», Int64.Type}, {«Weekday Num», Int64.Type}})
en
ChangedType1
en
fnDateTable
Anónimo
Pude hacerlo, pero esta es una solución bastante horrible en comparación con la forma en que probablemente se supone que debes hacerlo.
Comencé creando un horario para cada incremento de 30 minutos en el día. Para hacer esto, abusé de una lista de números enteros con Number.Mod():
List.Transform({1..48}, each #time(Number.RoundDown((_ * 30) / 60), Number.Mod(_ * 30, 60), 0)),
Básicamente, hay 48 incrementos de 30 minutos en un día. Para cada incremento, multiplíquelo por 30 y convierta esos minutos totales en horas y minutos, luego utilícelos en un token de tiempo (o como se llamen esas cosas).
En este punto, tenemos una lista de incrementos de 30 minutos en un día:
Luego, utilicé el código que publicaste para construir la dimensión de la fecha. A partir de ahí, queremos un producto cruzado de nuestras fechas y horas. Desafortunadamente, no vi una manera fácil para que M hiciera esto. Así que elegí la opción nuclear: crear una columna en ambas tablas que contenga solo el valor «1», luego hacer una unión interna en la lista de horas y fechas.
Después de hacer eso, lo expande y termina con la misma dimensión de fecha, excepto que ahora hay 48 intervalos de tiempo de 30 minutos en una columna adicional para cada fecha:
Sin embargo, esto probablemente se pueda hacer con un solo cambio trivial en su código existente, así que tome todo esto con pinzas.
Consultas M completas finales:
horario:
let Source = List.Transform({1..48}, each #time(Number.RoundDown((_ * 30) / 60), Number.Mod(_ * 30, 60), 0)), #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Changed Type" = Table.TransformColumnTypes(#"Converted to Table",{{"Column1", type time}}), #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Column1", "Times"}}), #"Added Custom" = Table.AddColumn(#"Renamed Columns", "Joiner", each 1) in #"Added Custom"
Tabla de fechas:
let Source = DateTableGenerator(#date(2017, 1, 1), #date(2017, 6, 30), null), #"Added Custom" = Table.AddColumn(Source, "Joiner", each 1), #"Merged Queries" = Table.NestedJoin(#"Added Custom",{"Joiner"},Times,{"Joiner"},"Times",JoinKind.Inner), #"Expanded Times" = Table.ExpandTableColumn(#"Merged Queries", "Times", {"Times"}, {"Times.1"}), #"Renamed Columns" = Table.RenameColumns(#"Expanded Times",{{"Times.1", "Times"}}) in #"Renamed Columns"
mecanix85
StartDate y EndDate como DateTime
FechaInicio = #fechahora(2016,1,1,0,0,0),
Fecha de finalización = #fechahora(2016,12,31,23,59,59),
Reemplazar rojo por verde
DayCount = Duración.Días(Duración.Desde(FechaFinal – FechaInicio))+1
Fuente = List.Dates(StartDate,DayCount,#duration(1,0,0,0)),
Fuente = List.DateTimes(StartDate, DayCount, #duration (0,0,1,0))
DayCount = Duration.TotalMinutes(Duration.From (EndDate – StartDate))+1,
#duración( días como número, horas como número, minutos como número, segundos como número)
MJC1
En respuesta a mecanix85
Hola,
Muchas gracias por su ayuda.
Probé los mods que sugeriste y funciona muy bien.
Atentamente,
MJC
Anónimo
En respuesta a mecanix85
Sí, mechanix85 tiene la idea correcta aquí. Mucho más fácil que lo que publiqué.
Tenga en cuenta que deberá realizar un intercambio directo en esa columna de fecha en las líneas posteriores que intenten ejecutar funciones basadas en fechas, porque en este punto, es una fecha y hora (alternativamente, use una nueva columna llamada Fecha generada a partir de la parte Fecha de la fecha y hora). A partir de ahí, puede aislar su fecha y hora en nuevas columnas si lo desea, o simplemente dejarlo como está.
Usando la sugerencia de mechanix85, la fórmula final podría verse así:
let fnDateTable = (StartDate as datetime, EndDate as datetime, optional Culture as nullable text) as table => let Source = List.DateTimes(StartDate, DayCount , #duration (0,0,30,0)), DayCount = Duration.TotalMinutes(Duration.From (EndDate - StartDate))+1,TableFromList = Table.FromList(Source, Splitter.SplitByNothing()), ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type datetime}}), RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "DateTime"}}), InsertDate = Table.AddColumn(RenamedColumns, "Date", each Date.From([DateTime]), type date), InsertTime = Table.AddColumn(InsertDate, "Time", each Time.From([DateTime]), type time), InsertYear = Table.AddColumn(InsertTime , "Year", each Date.Year([Date]),type text), InsertQuarterNum = Table.AddColumn(InsertYear, "Quarter Num", each Date.QuarterOfYear([Date])), InsertQuarter = Table.AddColumn(InsertQuarterNum, "Quarter", each "Q" & Number.ToText([Quarter Num])), InsertMonth = Table.AddColumn(InsertQuarter, "Month Num", each Date.Month([Date]), type text), InsertStartOfMonth = Table.AddColumn(InsertMonth, "StartOfMonth", each Date.StartOfMonth([Date]), type date), InsertEndOfMonth = Table.AddColumn(InsertStartOfMonth, "EndOfMonth", each Date.EndOfMonth([Date]), type date), InsertDay = Table.AddColumn(InsertEndOfMonth, "DayOfMonth", each Date.Day([Date])), InsertDayInt = Table.AddColumn(InsertDay, "DateInt", each [Year]*10000 + [Month Num]*100 + [DayOfMonth]), InsertMonthName = Table.AddColumn(InsertDayInt, "Month", each Date.ToText([Date], "MMMM", Culture), type text), InsertShortMonthName = Table.AddColumn(InsertMonthName, "Month short", each Date.ToText([Date], "MMM", Culture), type text), InsertCalendarMonth = Table.AddColumn(InsertShortMonthName, "Month Year", each [Month short]& " " & Number.ToText([Year]),type text), InsertCalendarQtr = Table.AddColumn(InsertCalendarMonth, "Quarter Year", each "Q" & Number.ToText([Quarter Num]) & " " & Number.ToText([Year]), type text), InsertDayWeek = Table.AddColumn(InsertCalendarQtr, "Weekday Num", each Date.DayOfWeek([Date])), InsertDayName = Table.AddColumn(InsertDayWeek, "Weekday", each Date.ToText([Date], "dddd", Culture), type text), InsertShortDayName = Table.AddColumn(InsertDayName, "Weekday short", each Date.ToText([Date], "ddd", Culture), type text), InsertWeekEnding = Table.AddColumn(InsertShortDayName , "EndOfWeek", each Date.EndOfWeek([Date]), type date), InsertWeekNumber= Table.AddColumn(InsertWeekEnding, "Week Num", each Date.WeekOfYear([Date])), InsertMonthWeekNumber= Table.AddColumn(InsertWeekNumber, "WeekOfMonth Num", each Date.WeekOfMonth([Date])), InsertMonthnYear = Table.AddColumn(InsertMonthWeekNumber,"Month-YearOrder", each [Year]*10000 + [Month Num]*100), InsertQuarternYear = Table.AddColumn(InsertMonthnYear,"Quarter-YearOrder", each [Year]*10000 + [Quarter Num]*100), ChangedType1 = Table.TransformColumnTypes(InsertQuarternYear,{{"Quarter-YearOrder", Int64.Type},{"Week Num", Int64.Type},{"WeekOfMonth Num", Int64.Type},{"Quarter", type text},{"Year", type text},{"Month-YearOrder", Int64.Type}, {"DateInt", Int64.Type}, {"DayOfMonth", Int64.Type}, {"Month Num", Int64.Type}, {"Quarter Num", Int64.Type}, {"Weekday Num", Int64.Type}}) in ChangedType1 in fnDateTable
MJC1
En respuesta a Anónimo
Hola,
Muchas gracias por su ayuda.
No he tenido el cambio para implementar su enfoque, pero lo haré.
Te mantendré informado sobre esto.
Atentamente,
MJC
OpenDataLab
En respuesta a Anónimo
Desde el punto de vista del diseño, habría ido con 2 tablas separadas, una tabla de fechas y una tabla de horarios separada.
Terminará con el mismo resultado desde el punto de vista de los informes y su modelo de datos será más pequeño y más simple.
MJC1
En respuesta a OpenDataLab
Hola OpenDataLab,
Me gusta mucho tu idea.
Me gustaría probar tu enfoque.
¿Tiene el código de la tabla de fechas y la tabla de horarios que se pueden compartir?
Espero escuchar de usted.
Salud,
MJC
OpenDataLab
En respuesta a MJC1
Aquí hay enlaces a una dimensión de fecha y una dimensión de tiempo típicas:
Una unidad – Dimensión de fecha
One Drive – Dimensión del tiempo
En Power Query, deberá dividir su campo de fecha y hora en un campo de fecha y un campo de hora; puede usar la función de análisis para hacer esto:
MJC1
En respuesta a OpenDataLab
Hola OpenDataLab,
Ahora estoy probando esta opción pero estoy teniendo algunos problemas.
Puedo cargar ambas consultas de energía según su secuencia de comandos a continuación. (solo para su información, selecciono las fechas del 01/01/2017 al 31/12/2017)
Ahora estoy teniendo problemas cuando cargo mi fecha. miBásicamente, mi archivo CSV tiene dos columnas. El encabezado de la columna 1 es «Fecha» y contiene fechas del siguiente formato 01/01/2017 y el encabezado de la columna 2 es «XYZ» y contiene números, ya que este es mi conjunto de datos. Mi conjunto de datos comienza el 01/01/2017 y termina el 24/07/2017 y se mueve en un paso de tiempo de 30 minutos. Cuando intento cargar mi get, aparece un mensaje que dice que hay problemas con las filas. Quizás esto tenga que ver con lo de Parse que mencionaste. Le agradecería si pudiera aclarar cómo podría resolver esto o considerar el análisis. Necesito un poco más de información que eso sobre tu figura. Soy un verdadero novato.
¿Podría ser también porque las fechas en mis datos son para medio año, mientras que el rango que seleccioné en la consulta de energía es para todo el año?
Muchas gracias por su ayuda de antemano.
OpenDataLab
En respuesta a MJC1
Prueba esto.
La otra forma de analizar los datos es cambiar el tipo de datos, pero cuando lo hace, debe especificar la configuración regional de los datos de origen. Una forma de hacer esto es elegir la opción «Usando la configuración regional…» en el menú desplegable Cambiar tipo de datos de la columna.
Una vez que seleccione esta opción, se le presentará la siguiente pantalla. Elija las opciones ilustradas a continuación.
Ahora Power Query sabe cuál es el formato de sus datos de origen, puede interpretar los datos correctamente y convertirlos.