Hora de inicio y finalización

Un usuario Pregunto ✅

jojo54

Hola, bastante nuevo en Power BI. Estoy tratando de replicar algo que hago en Excel en Power BI, principalmente porque Excel no puede manejar la cantidad de datos que se están procesando.

Estoy tratando de averiguar qué tan lleno está un café en diferentes momentos del día. Tengo los siguientes datos sobre cada cliente y a qué hora llegan y salen del café.

Nombre Hora de entrada Hora de salida
Persona 1 6:00 9:00
Persona 2 7:00 8:30
Persona 3 8:00 9:15
Persona 4 6:45 10:00
Persona 5 7:15 7:45

Y quiero ver cuántas personas hay realmente en el café en un momento dado, como en el siguiente

6:00 6:15 6:30 6:45 7:00 7:15 7:30 7:45 8:00
Persona 1 1 1 1 1 1 1 1 1 1
Persona 2 1 1 1 1 1
Persona 3
Persona 4 1 1 1 1 1 1
Persona 5 1 1 1
Total 1 1 1 2 3 4 4 4 3

Definitivamente puedo hacerlo en Excel, ¡pero no sé cómo hacerlo en Power BI! ¡Cualquier ayuda sería genial!

Geradav

En respuesta a jojo54

Hola @ jojo54

Vea si lo siguiente puede solucionarlo para lo que necesita

Number of clients 2 =
VAR vMinVal =
    MIN ( TimeTable[Value] )
VAR vMaxVal =
    MAX ( TimeTable[Value] )
VAR vNumberOfClients =
    COUNTROWS (
        FILTER (
            ALLSELECTED ( ClientsTbl ),
            ClientsTbl[Entry Time] <= vMinVal
                && ClientsTbl[Exit Time] >= vMaxVal
        )
    )
RETURN
    vNumberOfClients

Anotación 2019-08-09 120930.jpg

Cada vez que tengo más tiempo, puedo pensar en algo mejor.

jojo54

¡Gracias a todos! Disculpas por la demora en la respuesta, ¡vamos a echar un vistazo y probar estas soluciones!

Geradav

Hola @ jojo54

Aquí hay una alternativa que usa DAX

Number of clients =
VAR vMinVal =
    MIN ( TimeTable[Value] )
VAR vMaxVal =
    MAX ( TimeTable[Value] )
VAR vClientEntry =
    CALCULATE (
        COUNTROWS ( ClientsTbl ),
        TimeTable[Value] <= vMinVal,
        ALL ( TimeTable )
    )
VAR vClientExit =
    CALCULATE (
        COUNTROWS ( ClientsTbl ),
        TimeTable[Value] >= vMaxVal,
        ALL ( TimeTable ),
        USERELATIONSHIP ( ClientsTbl[Exit Time], TimeTable[Value] )
    )
RETURN
    MIN ( vClientExit, vClientEntry )

Cree una tabla de tiempo, luego cree una relación entre la Hora de inicio y el valor de la hora, y una segunda entre la Hora de salida y el valor de la hora. Uno será una relación activa, mientras que el segundo estará inactivo.

Como esto:

Anotación 2019-08-03 141705.jpg

Entonces puedes usar esa medida en tu visualización. Valor de tiempo en el eje X y la medida en el área Valor

Anotación 2019-08-03 142013.jpg

Y también puede hacer uso del mismo código DAX en el modelo de datos de Excel (Power Pivot)

Háganos saber lo que funciona para usted

jojo54

En respuesta a Geradav

@Geradav

¡Gracias por esta solución! ¡Me gusta que de hecho puedo escribir esto para averiguar lo que está haciendo!

Pero encuentro un problema con lo siguiente: (tabla actualizada)

Nombre Hora de entrada Hora de salida
Persona 1 6:00 9:00
Persona 2 7:00 8:30
Persona 3 8:15 9:15
Persona 4 6:45 10:00
Persona 5 7:15 7:45

Si tuviera que mirar a las 8 am, de acuerdo con la consulta de DAX,

vcliententry = 4

vclientexit = 4

Entonces la consulta devolverá 4 siendo min (4,4)

Sin embargo, en realidad solo hay 3 personas en el café (Persona 1, 2, 4)

Intenté escribir esto en papel y descubrí que este error de cálculo ocurre cuando hay personas en la lista que han salido antes de TimeValue Y hay personas que aún no han ingresado al café en TimeValue.

¿Alguna idea sobre cómo solucionar este problema?

¡Gracias!


Geradav

En respuesta a jojo54

Hola @ jojo54

Vea si lo siguiente puede solucionarlo para lo que necesita

Number of clients 2 =
VAR vMinVal =
    MIN ( TimeTable[Value] )
VAR vMaxVal =
    MAX ( TimeTable[Value] )
VAR vNumberOfClients =
    COUNTROWS (
        FILTER (
            ALLSELECTED ( ClientsTbl ),
            ClientsTbl[Entry Time] <= vMinVal
                && ClientsTbl[Exit Time] >= vMaxVal
        )
    )
RETURN
    vNumberOfClients

Anotación 2019-08-09 120930.jpg

Cada vez que tengo más tiempo, puedo pensar en algo mejor.

kriswright77

En respuesta a Geradav

Hola Geradev

Tengo un problema similar al que enfrenta el OP, y he intentado implementar sus soluciones para mi propio propósito, pero obtengo resultados incorrectos (probablemente similares al OP)

Todavía no incursiono en BI, pero recientemente comencé a enseñarme Power Query y Power Pivot en Excel, que es similar, así que espero que no sea la razón del error de resultados.

Si creo una medida de tabla dinámica similar a su primera solución, algunos resultados son incorrectos para algunos períodos y algunas empresas (necesito contar el número de personas de una empresa en particular en cada período).
Y si pruebo la segunda solución, obtengo el total de subvenciones correcto de personas en cada período, pero se repite para todas las empresas.

Con respecto a la primera solución, parece que está tratando de replicar una función Excel CountIfs, donde toma el mínimo (por compañía) de «Personas que ingresan antes del período de tiempo» y «Personas que se van después del período de tiempo», independientemente de cuándo entraron.

El resultado que creo que realmente necesito es el recuento de personas que han entrado y no se han ido.

¿Hay alguna forma de hacer esto?

Con respecto a la segunda solución, todavía no he aprendido lo suficiente como para averiguar cómo adaptar la fórmula para que regrese por empresa.

Cualquier ayuda que pueda brindar será recibida con gratitud.

Kris

samsaralamb

En respuesta a Geradav

Hola Geradav, parece que tu solución se basa en una fecha. Si hay varios días, ¿puedo preguntar cómo manejarlo? ¡Gracias!

Geradav

En respuesta a samsaralamb

Hola @samsaralamb,

Si lo entendí correctamente, en lugar de usar una tabla de tiempo (con solo valores de tiempo), podría tener una tabla que use valores de fecha y hora, para que pueda obtener la frecuencia durante varios días

jojo54

En respuesta a Geradav

hola, ahora estoy tratando de agregar una columna adicional de información que muestra de qué compañía es la persona. Sin embargo, cuando trato de aplicar un filtro de página para filtrar por empresas individuales, el comando parece seguir revisando toda la tabla y no filtrando el recuento solo para esa empresa. ¿Alguna idea para solucionarlo?

jojo54

En respuesta a Geradav

@Geradav gracias !! ¡Eso funciona perfectamente!

mussaenda

En respuesta a Geradav

Hola @Geradav,

Buen enfoque usando dax! ¿Hay alguna manera de hacer que el intervalo sea cada 15 minutos en lugar de cada 5 minutos?

Geradav

En respuesta a mussaenda

Hola @mussaenda

Usé una función de tabla para generar una serie de tiempo con un incremento de 5 minutos, así que sí, puede ser fácilmente cambiado a 15 minutos.

TimeTable =
GENERATESERIES ( TIME ( 5, 0, 0 ), TIME ( 13, 0, 0 ), TIME ( 0, 15, 0 ) )

mussaenda

Hola @ jojo54,

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCkgtKs7PUzBU0lEyszIwAFKWICpWBy5lBBQzh0hZWBmjSBmDxaC6DE2RpUzABpqYAilDAzQTTcEmGkIooJLYWAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Name = _t, #"Entry Time" = _t, #"Exit Time" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Entry Time", type time}, {"Exit Time", type time}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each List.Times([Entry Time], 20, #duration(0, 0, 15, 0))),
    #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"Custom", type time}}),
    #"Added Custom1" = Table.AddColumn(#"Changed Type1", "Custom.1", each if [Exit Time] < [Custom] then "Hide" else "Show"),
    #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([Custom.1] = "Show"))
in
    #"Filtered Rows"

A partir del resultado que publicaste, la persona 3 también debe contar a las 8:00 porque las 8:00 es su hora de entrada, ¿verdad?

2019_08_03_10_58_24_Time_Duration_Power_BI_Desktop.png

El archivo está aquí

En respuesta a mussaenda

Buen enfoque @mussaenda, ¿por qué usar el 20 en List.Times?

Además, @ jojo54, dado que este código funcionará en Excel, me interesaría saber qué problemas de rendimiento tiene que está probando PowerBI. ¿Es la versión de Excel de 32 bits la que te limita?

Wyn

jojo54

En respuesta a wynhopkins

Tengo ~ 3 millones de líneas de datos, por lo que Excel es extremadamente limitante. Lo estoy mirando todos los días, a lo largo de algunos años.

mussaenda

En respuesta a wynhopkins

Hola @wynhopkins,

Gracias por el cumplido. Solo usé 20 porque asumí que una persona se queda en un café como máximo 5 horas.

20 se pueden cambiar, @ jojo54. depende de su necesidad. 🙂

¡Que tenga un lindo día!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *