Para un promedio móvil en Power BI, combina DATESINPERIOD, que devuelve las fechas de los últimos N días o meses hasta la fecha actual del visual, con AVERAGEX o con una división. Un promedio móvil de 3 días es AVERAGEX(DATESINPERIOD('Calendario'[Fecha], MAX('Calendario'[Fecha]), -3, DAY), [Ventas]). Necesitas una tabla de calendario con fechas continuas, relacionada con tus datos y marcada como tabla de fechas.
Sintaxis
DATESINPERIOD ( <fechas>, <fecha_inicio>, <número_de_intervalos>, <intervalo> )
| Argumento | En un promedio móvil |
|---|---|
fechas | La columna de fechas del calendario: 'Calendario'[Fecha] |
fecha_inicio | La última fecha visible: MAX('Calendario'[Fecha]) |
número_de_intervalos | Negativo para ir hacia atrás: -7 son los 7 días que terminan en la fecha de inicio |
intervalo | DAY, MONTH, QUARTER o YEAR, sin comillas |
Paso a paso
- Crea o importa una tabla
Calendariocon una fila por día, sin huecos ni duplicados, que cubra todo el rango de tus datos. - Márcala como tabla de fechas (en la vista de tabla, Marcar como tabla de fechas) y relaciónala con la columna de fecha de tus hechos.
- Crea la medida base:
Ventas = SUM(Ventas[Importe]). - Crea la medida móvil con
DATESINPERIODy uno de los patrones de abajo. - Pon
'Calendario'[Fecha](no la fecha de la tabla de ventas) en el eje del visual.
Ejemplos resueltos
Ejemplo 1: promedio móvil de 3 días
Ventas diarias del 1 al 8 de enero: 300, 163, 275, 196, sin ventas el día 5, 410, 228 y 252.
Promedio móvil 3 días =
AVERAGEX (
DATESINPERIOD ( 'Calendario'[Fecha], MAX ( 'Calendario'[Fecha] ), -3, DAY ),
[Ventas]
)
| Fecha | Ventas | Promedio móvil 3 días |
|---|---|---|
| 03/01/2026 | 275 | 246.00 |
| 04/01/2026 | 196 | 211.33 |
| 05/01/2026 | (blanco) | 235.50 |
| 06/01/2026 | 410 | 303.00 |
| 07/01/2026 | 228 | 319.00 |
| 08/01/2026 | 252 | 296.67 |
El 3 de enero promedia 300, 163 y 275. El día 5 no tiene ventas: [Ventas] es blanco y AVERAGEX lo ignora, así que el 5, el 6 y el 7 promedian solo dos días. Los días 1 y 2 muestran 300 y 231.5, promedios de 1 y 2 días, porque antes del 1 de enero no hay ventas.
Ejemplo 2: contar los días sin ventas como cero
Si la tienda estuvo abierta el día 5 y simplemente no vendió, ese día debe contar como 0:
Promedio móvil 3 días (con ceros) =
AVERAGEX (
DATESINPERIOD ( 'Calendario'[Fecha], MAX ( 'Calendario'[Fecha] ), -3, DAY ),
[Ventas] + 0
)
Ahora el día 5 vale (275 + 196 + 0) / 3 = 157, el 6 vale 202 y el 7, 212.67. La diferencia con el ejemplo 1 es grande: 235.5 contra 157 el mismo día. Ninguna de las dos es incorrecta; depende de si un día vacío significa «cerrado» o «sin ventas». Para no mostrar promedios incompletos al inicio, devuelve blanco mientras no haya tres días de historia:
Promedio móvil 3 días (completo) =
VAR PrimerDia = CALCULATE ( MIN ( Ventas[Fecha] ), REMOVEFILTERS () )
RETURN
IF ( MAX ( 'Calendario'[Fecha] ) >= PrimerDia + 2, [Promedio móvil 3 días (con ceros)] )Ejemplo 3: promedio móvil de 3 meses en un visual mensual
Con ventas mensuales de 41,200 (enero), 38,900, 45,300, 44,100, 47,800 y 50,100 (junio), y el visual por mes:
Promedio móvil 3 meses =
VAR Periodo =
DATESINPERIOD ( 'Calendario'[Fecha], MAX ( 'Calendario'[Fecha] ), -3, MONTH )
VAR Total = CALCULATE ( [Ventas], Periodo )
VAR Meses = CALCULATE ( DISTINCTCOUNT ( 'Calendario'[Año-Mes] ), Periodo )
RETURN
DIVIDE ( Total, Meses )
En marzo, el periodo va del 1 de enero al 31 de marzo y el resultado es (41,200 + 38,900 + 45,300) / 3 = 41,800. Abril da 42,766.67, mayo 45,733.33 y junio 47,333.33. MAX('Calendario'[Fecha]) en la fila de marzo es el 31 de marzo, y tres meses hacia atrás desde ahí cubren enero, febrero y marzo completos. Dividir entre los meses del calendario (y no promediar con AVERAGEX sobre meses) evita problemas cuando el visual tiene año y mes en columnas separadas.
Errores comunes
- Usar la fecha de la tabla de hechos.
DATESINPERIOD(Ventas[Fecha], ...)solo ve fechas con ventas y no sirve para días vacíos. Usa siempre la columna del calendario, también en el eje del visual. - Calendario con huecos o duplicados. Las funciones de inteligencia de tiempo esperan una fila por día, sin saltos. Genéralo con
CALENDARoCALENDARAUTOsi no tienes uno. número_de_intervalospositivo.3en lugar de-3toma los días siguientes: el promedio «adelanta» datos que todavía no ocurrieron.- No comprobar el rango. Antes de confiar en la medida, crea una auxiliar con el mismo periodo,
Inicio del periodo = CALCULATE(MIN('Calendario'[Fecha]), DATESINPERIOD('Calendario'[Fecha], MAX('Calendario'[Fecha]), -3, MONTH)), y ponla en el visual. En la fila de abril debe mostrar el 1 de febrero;-7, DAYdesde el 8 de enero debe empezar el día 2. - Totales confusos. En la fila de total,
MAX('Calendario'[Fecha])es la última fecha visible, así que el total muestra el promedio móvil de los últimos días, no un promedio de la columna.
Comprueba una serie corta con la calculadora de promedio móvil. La versión con funciones de ventana está en promedio móvil en SQL.
Fuentes
- Microsoft Learn, DATESINPERIOD (DAX). Argumentos, intervalos DAY, MONTH, QUARTER, YEAR y desplazamiento negativo. Consultado el 11 de noviembre de 2026.
- Microsoft Learn, tablas de fechas en Power BI Desktop. Marcar como tabla de fechas, fechas únicas y continuas. Consultado el 11 de noviembre de 2026.