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

Cálculo del intervalo de una columna acumulativa

Tengo grandes conjuntos de datos de aproximadamente 1 minuto de lecturas acumulativas de medidores de energía de varios medidores en varios hogares, y dentro de Power BI necesito calcular el intervalo para cada medidor entre cada paso de tiempo para poder mostrar el consumo de energía.

Soy relativamente nuevo en DAX y realmente estoy luchando para que esto funcione. He intentado seguir el ejemplo de este hilo, pero tengo problemas con la función EARLIER. Tampoco puedo hacer que esto funcione con los datos de ejemplo proporcionados dentro de ese subproceso, así que me pregunto si esta solución ya no es compatible con la versión actual de Power BI.

A continuación se muestra un ejemplo de los datos una vez importados y limpiados. Verá que hay cuatro columnas de lecturas acumulativas del medidor (amarillo resaltado), las marcas de tiempo (naranja resaltado) y las diferentes identificaciones de la casa (resaltadas en rojo).

¿Alguien puede ayudarme con esto? ¡Me está volviendo loco!

johnlloyd45_1-1641482404972.png

1 ACCEPTED SOLUTION

@johnlloyd45 ,

He actualizado su archivo pbix de muestra (ver archivo adjunto), compruebe si eso es lo que desea.

1. Cree una columna calculada como la siguiente para obtener la fecha (hora) anterior

Pre DateTime (Hour) = 
CALCULATE (
    MAX ( 'Trial Import'[DateTime (Hour)] ),
    FILTER (
        'Trial Import',
        'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
            && 'Trial Import'[DateTime (Hour)] < EARLIER ( 'Trial Import'[DateTime (Hour)] )
    )
)

yingyinr_0-1641981255478.png

2. Crear las medidas como se muestra a continuación para obtener el intervalo de agua caliente, regulada y renovable

Hot Water Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _htusage =
    SUM ( 'Trial Import'[Hot Water Usage] )
VAR _prehtusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Hot Water Usage]
    )
RETURN
    IF ( ISBLANK ( _prehtusage ), BLANK (), _htusage - _prehtusage )
Regulated Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _regusage =
    SUM ( 'Trial Import'[Regulated Energy Used] )
VAR _preregusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Regulated Energy Used]
    )
RETURN
    IF ( ISBLANK ( _preregusage ), BLANK (), _regusage - _preregusage )
Renewable Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _reusage =
    SUM ( 'Trial Import'[Unregulated Energy Used] )
VAR _prerenusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Unregulated Energy Used]
    )
RETURN
    IF ( ISBLANK ( _prerenusage ), BLANK (), _reusage - _prerenusage )

yingyinr_1-1641981594850.png

Saludos

View solution in original post

12 REPLIES 12
Syndicate_Admin
Administrator
Administrator

@johnlloyd45 hay muchas maneras de hacer esto y la única preocupación que tendré es el rendimiento. ¿Qué tan grande es su conjunto de datos?

El conjunto de datos eventualmente será para alrededor de 300 hogares, con una lectura de medidor cada 10 a 15 minutos, y crecerá indefinidamente. Siempre puedo limitar el tamaño del conjunto de datos archivando lecturas anteriores y manteniendo solo los últimos 12 meses más o menos de datos en Power BI. Una vez que lo tenga funcionando, también buscaría alejarme de Power BI Desktop y mover la versión hospedada en la nube, que supongo que se ocuparía mucho mejor de la gran escala.

Syndicate_Admin
Administrator
Administrator

@johnlloyd45 está recibiendo algún error? ¿Qué expresión usaste? Será más fácil si pega los datos en el formato de tabla y comparte la salida esperada.

Síguenos en LinkedIn (en inglés) y YouTube.gif a nuestro YouTube (en inglés) canal

Más información sobre el formato condicional en Microsoft Reactor

Mi última entrada de blog El poder de usar grupos de cálculo con relaciones inactivas (Parte 1) (perytus.com) Yo lo haría Elogios si mi solución ayudó. 👉 Si puede dedicar tiempo a publicar la pregunta, también puede hacer esfuerzos para felicitar a quien ayudó a resolver su problema. ¡Es una muestra de agradecimiento!

Visítenos en https://perytus.com, su ventanilla única para proyectos/formación/consultoría relacionados con Power BI.

Claro. Puede descargar un archivo de Power BI de ejemplo con una selección de los datos y tablas aquí.

https://www.dropbox.com/s/jkoweuvuw3n6649/Cumulative%20Meter%20Reading%20Example.pbix?dl=0

He probado numerosos ejemplos de publicaciones en este foro, pero no he logrado tener éxito.

En este archivo he filtrado por un solo ID de casa y he agregado los datos en valores de lectura de medidores diarios en una tabla y valores de lectura de medidores por hora en otra tabla. De esto se puede ver que las lecturas son acumulativas y, por lo tanto, no representan el consumo de energía para cada día o período por hora. A continuación se muestra un ejemplo de la tabla horaria:

Identificación de la casaDateTime (Hora)Uso de agua calienteEnergía regulada utilizadaEnergía no regulada utilizada
18899409/05/2021 14:00339724024.5674377.91
18899409/05/2021 15:00339724024.8344378.033
18899409/05/2021 16:00339724025.0994378.158
18899409/05/2021 17:00339724025.3664378.281
18899409/05/2021 18:00339724025.6314378.407
18899409/05/2021 19:00339724025.8984378.531
18899409/05/2021 20:00339724026.6974378.651

Estoy buscando agregar algunas columnas calcualizadas para cada uno de los cuatro metros, que es la diferencia entre la lectura en cada momento y la lectura en el momento anterior: las columnas rojas a continuación.

Identificación de la casaDateTime (Hora)Uso de agua calienteIntervalo de agua calienteEnergía regulada utilizadaIntervalo reguladoEnergía no regulada utilizadaIntervalo renovable
18899409/05/2021 14:003397204024.56704377.910
18899409/05/2021 15:003397204024.8340.2674378.0330.123
18899409/05/2021 16:003397204025.0990.2654378.1580.125
18899409/05/2021 17:003397204025.3660.2674378.2810.123
18899409/05/2021 18:003397204025.6310.2654378.4070.126
18899409/05/2021 19:003397204025.8980.2674378.5310.124
18899409/05/2021 20:003397204026.6970.7994378.6510.12
18899409/05/2021 21:003397204026.9940.2974378.7760.125
18899409/05/2021 22:003397204027.2620.2684378.9030.127
18899409/05/2021 23:003397204027.5260.2644379.0210.118
18899410/05/2021 00:003397204027.7910.2654379.1440.123
18899410/05/2021 01:003397204028.5790.7884379.2680.124
18899410/05/2021 02:003397204031.8823.3034379.3880.12
18899410/05/2021 03:003397204032.550.6684379.5060.118

@johnlloyd45 ,

He actualizado su archivo pbix de muestra (ver archivo adjunto), compruebe si eso es lo que desea.

1. Cree una columna calculada como la siguiente para obtener la fecha (hora) anterior

Pre DateTime (Hour) = 
CALCULATE (
    MAX ( 'Trial Import'[DateTime (Hour)] ),
    FILTER (
        'Trial Import',
        'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
            && 'Trial Import'[DateTime (Hour)] < EARLIER ( 'Trial Import'[DateTime (Hour)] )
    )
)

yingyinr_0-1641981255478.png

2. Crear las medidas como se muestra a continuación para obtener el intervalo de agua caliente, regulada y renovable

Hot Water Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _htusage =
    SUM ( 'Trial Import'[Hot Water Usage] )
VAR _prehtusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Hot Water Usage]
    )
RETURN
    IF ( ISBLANK ( _prehtusage ), BLANK (), _htusage - _prehtusage )
Regulated Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _regusage =
    SUM ( 'Trial Import'[Regulated Energy Used] )
VAR _preregusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Regulated Energy Used]
    )
RETURN
    IF ( ISBLANK ( _preregusage ), BLANK (), _regusage - _preregusage )
Renewable Interval =
VAR _prehour =
    SELECTEDVALUE ( 'Trial Import'[Pre DateTime (Hour)] )
VAR _reusage =
    SUM ( 'Trial Import'[Unregulated Energy Used] )
VAR _prerenusage =
    SUMX (
        FILTER (
            ALLSELECTED ( 'Trial Import' ),
            'Trial Import'[DateTime (Hour)] = _prehour
        ),
        'Trial Import'[Unregulated Energy Used]
    )
RETURN
    IF ( ISBLANK ( _prerenusage ), BLANK (), _reusage - _prerenusage )

yingyinr_1-1641981594850.png

Saludos

Hola @yingyinr,en lugar de calcular los intervalos como medidas, ¿sería posible hacerlos como columnas calculadas para poder usar la agregación para ver los datos en diferentes intervalos de tiempo?

@johnlloyd45 ,

Puede crear las columnas calculadas como se muestra a continuación para obtenerlas, encuentre los detalles en el archivo adjunto.

Column_Hot Water Interval = 
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _prehtgusage =
    CALCULATE (
        SUM ( 'Trial Import'[Hot Water Usage] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = _prehour
        )
    )
VAR _curhtgusage =
    CALCULATE (
        SUM ( 'Trial Import'[Hot Water Usage] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
        )
    )
RETURN
    IF ( ISBLANK ( _prehtgusage ), BLANK (), _curhtgusage - _prehtgusage )
Column_Regulated Interval = 
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _preregusage =
    CALCULATE (
        SUM ( 'Trial Import'[Regulated Energy Used] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = _prehour
        )
    )
VAR _curregusage =
    CALCULATE (
        SUM ( 'Trial Import'[Regulated Energy Used] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
        )
    )
RETURN
    IF ( ISBLANK ( _preregusage ), BLANK (), _curregusage - _preregusage )
Column_Renewable Interval = 
VAR _prehour = 'Trial Import'[Pre DateTime (Hour)]
VAR _prerenusage =
    CALCULATE (
        SUM ( 'Trial Import'[Unregulated Energy Used] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = _prehour
        )
    )
VAR _currenusage =
    CALCULATE (
        SUM ( 'Trial Import'[Unregulated Energy Used] ),
        FILTER (
            'Trial Import',
            'Trial Import'[Home ID] = EARLIER ( 'Trial Import'[Home ID] )
                && 'Trial Import'[DateTime (Hour)] = EARLIER ( 'Trial Import'[DateTime (Hour)] )
        )
    )
RETURN
    IF ( ISBLANK ( _prerenusage ), BLANK (), _currenusage - _prerenusage )

yingyinr_0-1642475461129.png

Saludos

Gracias @yingyinr,que parece haber hecho exactamente lo que quería, sin duda para los datos por hora. Pasaré algún tiempo entendiendo lo que has hecho y viendo si también puedo hacer que funcione para agregaciones, como totales diarios, mensuales, anuales, etc.

¡Eres una leyenda!

@johnlloyd45 si desea una columna calculada (en lugar de medir), eso significa que no está afectada por el contexto del filtro. Si ese es el caso y si lo obtiene de un RDBMS (por ejemplo, MS SQL), sería mucho más eficiente hacerlo en el lado del servidor que con DAX (no es que DAX no pueda encargarse de ello, pero el rendimiento será una preocupación).

Desafortunadamente, los datos entrantes provienen de archivos CSV diarios colocados en un sitio FTP, por lo que no tengo la opción de hacer la calcualtion antes de importarlos a Power BI. Estoy feliz de hacer el calc ya sea con una Medida o una Columna... Solo necesito encontrar una manera de hacerlo. Puedo mitigar los problemas de rendimiento más adelante si es necesario.

Hola @smpa01 y @parry2k

¿Alguna posibilidad de que pueda darme algunas sugerencias sobre cómo hacerlo, ignorando cualquier problema de rendimiento potencial por el momento?

¿Este parece ser un problema similar, aunque un poco más simple porque no tiene la complejidad adicional de las casas múltiples en el mismo conjunto de datos?

https://community.powerbi.com/t5/Desktop/Calculating-cumulative-difference-between-two-timestamps-fo...

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.