Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Lidiar con un reloj de 24 horas de desplazamiento

Así que estoy extrayendo datos de un ODBC donde los eventos se rastrean en función de la hora local en un reloj de 24 horas de 00:00 a 23:59. Cuando estamos evaluando un "Día" nos referimos a cada día como 02:01 - 02:00. El problema con el que me encuentro es que cualquier evento entre las 00:00 y las 02:00 se cuenta al día siguiente, cuando lo miramos para el día anterior.

Espero ayuda con lo siguiente:

Para compensar la fecha de cualquier evento en esa ventana de 2 horas para que sea el día anterior para que el comienzo del día sea en realidad el final del día en los gráficos.

Mi primer pensamiento es en power query agregando una columna personalizada y usando lo siguiente como fórmula.

(DepLoc = Hora local en el reloj estándar de 24 horas.)

=if [DepLoc] < #time(02, 00, 00) then [DepLoc] - #time(24, 00, 00) else DepLoc

Tome el DepLoc si son menos de las 2 am y reste 24 horas de él para que aparezca en la fecha en que lo consideramos, de lo contrario muestre el DepLoc tal como está.

¿Qué estoy haciendo mal con mi fórmula? Esto es un error

2 ACCEPTED SOLUTIONS
Syndicate_Admin
Administrator
Administrator

En Power Query, intente:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bcu7DcAgEIPhXa5GwmcSXqsg9l8jkKNACY1dfPpbE6hH8QRVnGiuwPyx3X3wMuNtxL1LZvFkNUxK2SjsRMuK/m0RcaS3HtQf", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Value = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Value", Int64.Type}}),
    #"Added Conditional Column" = Table.AddColumn(#"Changed Type", "Custom", each if [Time] < #time(2, 1, 0) then Date.AddDays([Date] as date, -1) else [Date]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Added Conditional Column",{{"Custom", type date}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Custom", "FactDate"}, {"Date", "SourceDate"}})
in
    #"Renamed Columns"

Llegar:

Datechange.JPG

(De hecho, puede eliminar la columna SourceDate original como último paso de la consulta. Lo he dejado con fines ilustrativos)

Para ordenar la hora de modo que se establezcan de 00:00 a 02:00 al final del día, cree una tabla de dimensiones para la hora que incluya una columna para ordenar la hora por:

let
    Source = List.Times(#time(0, 0, 0), 1440, #duration(0, 0, 1, 0)),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Time"}}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Renamed Columns",{{"Time", type time}}),
    #"Added Custom Column" = Table.AddColumn(#"Changed Type2", "Number", each let splitTime = Splitter.SplitTextByDelimiter(":", QuoteStyle.None)(Text.From([Time], "es-ES")) in Text.Combine({Text.Combine(splitTime), "00"}), type text),
    #"Changed Type" = Table.TransformColumnTypes(#"Added Custom Column",{{"Number", Int64.Type}}),
    #"Added Conditional Column" = Table.AddColumn(#"Changed Type", "26 hour day", each if [Number] < 20001 then ([Number] + 240000)/100 else [Number]/100),
    #"Removed Columns" = Table.RemoveColumns(#"Added Conditional Column",{"Number"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"26 hour day", Int64.Type}})
in
    #"Changed Type1"

Y ordene la columna Hora por la columna día de 26 horas una vez cargada en el modelo y puede usar cualquiera de las dos en los elementos visuales:

dim time.JPG

A continuación, cree una tabla Date y únala en una relación de uno a varios con el campo de fecha recién creado (FactDate en mi ejemplo) y haga lo mismo entre los campos Time de la tabla de dimensiones y la tabla de hechos. El modelo se ve así.

2021-09-25.png

A continuación, en la vista de modelo, seleccione la columna día de 26 horas en la lista de campos y establezca el formato en personalizado mediante:

Custom format.JPG

Dim time custom.JPG

Y aquí hay un ejemplo de lo que puede obtener configurando el eje como categórico:

result1.JPG

La ventaja de usar la columna de día de 26 horas es que IMHO es más clara y que puede usarla en un eje continuo, mientras que si usa la columna Tiempo en un eje continuo, el orden de tiempo predeterminado supera el orden establecido por la función "Ordenar columna por":

Continuous.png

He adjuntado un archivo PBIX de ejemplo

View solution in original post

Syndicate_Admin
Administrator
Administrator

@hnguy71 Tienes razón, debería haber comenzado allí, pero después de un poco más de ajustes pude encontrar el resultado menos deseable donde se mostrará al comienzo del día ajustando mi fórmula para que sea:

=if Time.From([DepLoc]) < #time(02, 00, 00) then [DepLoc] - #duration(1,0,0,0) else [DepLoc]

(Si el tiempo en DepLoc fue menor a las 2 a.m., reste 1 día de tiempo, de lo contrario, muestre DepLoc tal como está)

Mis datos en DepLoc se ven como ( 1/25/2021 12:10:00 AM ) y están en el formato de "Fecha/Hora"

@PaulDBrown Estoy muy interesado en cómo pudo lograr esto, ya que creo que un día de 26 horas sería una mejor experiencia de usuario. Mirando el archivo PBIX tienes los datos comenzando como dos columnas, una con fecha y otra con hora. Creo que voy a jugar con esto para ver si puedo usar esta misma estructura para mis datos. ¡Realmente aprecio una respuesta tan detallada! Definitivamente puedo ver cómo esto también respondería a mi pregunta, Gracias 🙂

View solution in original post

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

@hnguy71 Tienes razón, debería haber comenzado allí, pero después de un poco más de ajustes pude encontrar el resultado menos deseable donde se mostrará al comienzo del día ajustando mi fórmula para que sea:

=if Time.From([DepLoc]) < #time(02, 00, 00) then [DepLoc] - #duration(1,0,0,0) else [DepLoc]

(Si el tiempo en DepLoc fue menor a las 2 a.m., reste 1 día de tiempo, de lo contrario, muestre DepLoc tal como está)

Mis datos en DepLoc se ven como ( 1/25/2021 12:10:00 AM ) y están en el formato de "Fecha/Hora"

@PaulDBrown Estoy muy interesado en cómo pudo lograr esto, ya que creo que un día de 26 horas sería una mejor experiencia de usuario. Mirando el archivo PBIX tienes los datos comenzando como dos columnas, una con fecha y otra con hora. Creo que voy a jugar con esto para ver si puedo usar esta misma estructura para mis datos. ¡Realmente aprecio una respuesta tan detallada! Definitivamente puedo ver cómo esto también respondería a mi pregunta, Gracias 🙂

En cuanto a la dimensión Tiempo, puede copiar y pegar el código en una consulta en blanco (no está relacionada con ninguna otra consulta y simplemente crea la tabla desde cero).

En lo que respecta a que sus datos estén en Fecha/ Hora, generalmente se recomienda dividirlo en dos columnas (columnas Fecha y Hora) para permitir el uso de una tabla fecha y una dimensión Hora. Si intenta crear una dimensión Fecha/Hora, cada año tendrá 365 * 24 * 60 filas. Una tabla de fechas tiene 365 filas por año y una dimensión de tiempo es de solo 1440 filas (para horas y minutos).

Syndicate_Admin
Administrator
Administrator

Hay @DreDre ,

¿Las respuestas anteriores resuelven su problema? Si se ha resuelto, marque la respuesta correcta como la respuesta estándar para ayudar a los otros miembros a encontrarla más rápidamente. ¡Muchas gracias por su amable cooperación!

Espero que ayude,


Equipo de soporte de la comunidad _ Caitlyn

Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

Syndicate_Admin
Administrator
Administrator

En Power Query, intente:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bcu7DcAgEIPhXa5GwmcSXqsg9l8jkKNACY1dfPpbE6hH8QRVnGiuwPyx3X3wMuNtxL1LZvFkNUxK2SjsRMuK/m0RcaS3HtQf", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Value = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Value", Int64.Type}}),
    #"Added Conditional Column" = Table.AddColumn(#"Changed Type", "Custom", each if [Time] < #time(2, 1, 0) then Date.AddDays([Date] as date, -1) else [Date]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Added Conditional Column",{{"Custom", type date}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Custom", "FactDate"}, {"Date", "SourceDate"}})
in
    #"Renamed Columns"

Llegar:

Datechange.JPG

(De hecho, puede eliminar la columna SourceDate original como último paso de la consulta. Lo he dejado con fines ilustrativos)

Para ordenar la hora de modo que se establezcan de 00:00 a 02:00 al final del día, cree una tabla de dimensiones para la hora que incluya una columna para ordenar la hora por:

let
    Source = List.Times(#time(0, 0, 0), 1440, #duration(0, 0, 1, 0)),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Time"}}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Renamed Columns",{{"Time", type time}}),
    #"Added Custom Column" = Table.AddColumn(#"Changed Type2", "Number", each let splitTime = Splitter.SplitTextByDelimiter(":", QuoteStyle.None)(Text.From([Time], "es-ES")) in Text.Combine({Text.Combine(splitTime), "00"}), type text),
    #"Changed Type" = Table.TransformColumnTypes(#"Added Custom Column",{{"Number", Int64.Type}}),
    #"Added Conditional Column" = Table.AddColumn(#"Changed Type", "26 hour day", each if [Number] < 20001 then ([Number] + 240000)/100 else [Number]/100),
    #"Removed Columns" = Table.RemoveColumns(#"Added Conditional Column",{"Number"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"26 hour day", Int64.Type}})
in
    #"Changed Type1"

Y ordene la columna Hora por la columna día de 26 horas una vez cargada en el modelo y puede usar cualquiera de las dos en los elementos visuales:

dim time.JPG

A continuación, cree una tabla Date y únala en una relación de uno a varios con el campo de fecha recién creado (FactDate en mi ejemplo) y haga lo mismo entre los campos Time de la tabla de dimensiones y la tabla de hechos. El modelo se ve así.

2021-09-25.png

A continuación, en la vista de modelo, seleccione la columna día de 26 horas en la lista de campos y establezca el formato en personalizado mediante:

Custom format.JPG

Dim time custom.JPG

Y aquí hay un ejemplo de lo que puede obtener configurando el eje como categórico:

result1.JPG

La ventaja de usar la columna de día de 26 horas es que IMHO es más clara y que puede usarla en un eje continuo, mientras que si usa la columna Tiempo en un eje continuo, el orden de tiempo predeterminado supera el orden establecido por la función "Ordenar columna por":

Continuous.png

He adjuntado un archivo PBIX de ejemplo

Syndicate_Admin
Administrator
Administrator

¿Puede publicar una muestra de sus datos y resultados esperados?

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.