Tabla de fechas en Power BI: calendario y cálculos de tiempo

Cinta de los doce meses de 2026 con el tercer trimestre resaltado, que ilustra por qué una tabla de fechas en Power BI necesita años completos aunque solo se analicen 92 días

La tabla de fechas es la pieza más repetida de cualquier modelo de Power BI y también la que más informes rompe cuando falta. Sin ella no funcionan los acumulados del año, ni las comparaciones con el mes anterior, ni las medias móviles. Esta guía explica qué requisitos tiene que cumplir, cómo generarla, qué columnas añadirle y qué medidas de tiempo salen después.

Está escrita en dos niveles. Si usted lee informes, los apartados de requisitos y de errores frecuentes explican por qué a veces una comparación entre meses sale en blanco. En cambio, si construye el modelo, encontrará el código completo del calendario, las funciones de inteligencia de tiempo y el caso del año fiscal que no empieza en enero.

La serie y el caso común

Tercera de seis guías sobre el mismo conjunto de datos: 1.240 tickets de una mesa de servicio con cuatro sedes, entre julio y septiembre de 2026.

  1. Esquema estrella: hechos, dimensiones y claves.
  2. CALCULATE: contexto de filtro y modificadores.
  3. Tabla de fechas y cálculos de tiempo (esta guía).
  4. Visualizaciones: qué gráfico usar en cada caso.
  5. Áreas de trabajo, aplicaciones y actualización.
  6. Licencias: Free, Pro, PPU y capacidad.

Los tickets se reparten por mes de esta forma, y son las cifras que van a aparecer en todas las medidas:

MesDíasTicketsHorasTickets por día
Julio31431735,013,9
Agosto31396661,512,8
Septiembre30413712,013,8
Trimestre921.2402.108,513,5

Por qué hace falta una tabla de fechas

La razón inmediata es que las funciones de inteligencia de tiempo de DAX la exigen. Microsoft lo dice sin rodeos en su guía de diseño: para usarlas, el modelo debe tener al menos una.

Pero hay una razón anterior y más práctica. La columna de fecha que trae la tabla de hechos solo contiene los días en que ocurrió algo. Si en el caso no hubo ningún ticket el 3 de agosto, ese día simplemente no existe, y por lo tanto ningún gráfico lo dibujará. Una tabla de fechas propia tiene los 365 días de 2026, hubiera o no actividad.

Además, es la dimensión que permite agrupar por trimestre, por semana, por día laborable o por año fiscal sin tocar el hecho. Es decir, es el mismo argumento del esquema estrella aplicado al eje que más se usa.

Los cinco requisitos de una tabla de fechas

No vale cualquier lista de días. Para que Power BI la acepte tiene que cumplir estas condiciones:

RequisitoQué significaEn el caso
Columna de tipo fechaFecha o fecha y horaCalendario[Fecha]
Valores únicosUn día no puede repetirse365 valores distintos
Sin celdas en blancoNinguna fila vacía0 en blanco
Sin huecosTodos los días consecutivosDel 1 de enero al 31 de diciembre
Años completosEl año puede no ser natural2026 entero

El quinto sorprende a mucha gente. Aunque el caso solo analice un trimestre, la tabla tiene que abarcar el año completo: si se cargaran únicamente los 92 días de julio a septiembre, los acumulados anuales y las comparaciones fallarían. Por eso son 365 filas y no 92.

Conviene aclarar que «año completo» no obliga a ir de enero a diciembre. Si la empresa cierra su ejercicio en junio, el año completo va de julio a junio; lo importante es que no esté partido.

La fecha y hora automática, y por qué se desactiva

Power BI trae una opción llamada Fecha y hora automática que crea, de forma invisible, una tabla de calendario por cada columna de fecha del modelo. Es cómoda para una exploración rápida y para perfilar datos, y para eso está bien.

Sin embargo, tiene un límite serio: esas tablas ocultas no pueden propagar filtros a varias tablas, así que no sirven para un modelo con dos hechos como el del caso. Además ocupan espacio. Con dos columnas de fecha en Tickets y una en Consumo son tres calendarios invisibles que nadie usa.

La recomendación es sencilla: mantenerla activada solo para modelos ad hoc y desactivarla en cuanto el informe vaya a publicarse. Se encuentra en las opciones del archivo, dentro de la carga de datos.

Las cinco formas de conseguir la tabla de fechas

TécnicaCuándo conviene
Fecha y hora automáticaExploración rápida, modelos desechables
Conectar a una tabla del origenSi ya existe un almacén con dimensión de fecha
Generarla con Power QuerySi se quiere publicar como flujo de datos reutilizable
Generarla con DAXLo más rápido dentro de un solo archivo
Clonarla con DAXCuando hace falta una segunda por dimensión de rol

De las cinco, la segunda es la mejor si existe: un almacén de datos ya tiene su dimensión de fecha y usarla garantiza que toda la organización comparta la misma definición de trimestre. Cuando no existe, Microsoft sugiere publicar la tabla como flujo de datos para que todos los modeladores se conecten a la misma.

Para un archivo suelto, en cambio, generarla con DAX es lo más directo. Es lo que hace el caso de esta serie.

Generar la tabla de fechas con DAX

Hay dos funciones para ello, y la diferencia importa. CALENDAR recibe una fecha de inicio y otra de fin. CALENDARAUTO, en cambio, recorre todas las columnas de fecha del modelo y devuelve años completos que las cubren.

La segunda tiene dos ventajas notables: garantiza por sí sola el requisito de años completos y se extiende sola al actualizar, cuando llegan datos de un año nuevo. Esta es la tabla del caso:

Calendario =
ADDCOLUMNS (
    CALENDARAUTO (),
    "Año",             YEAR ( [Date] ),
    "Número de mes",   MONTH ( [Date] ),
    "Mes",             FORMAT ( [Date], "mmmm" ),
    "Año-mes",         FORMAT ( [Date], "yyyy-MM" ),
    "Trimestre",       "T" & QUARTER ( [Date] ),
    "Día de la semana", FORMAT ( [Date], "dddd" ),
    "Es laborable",    IF ( WEEKDAY ( [Date], 2 ) <= 5, "Sí", "No" )
)

Con los datos del caso devuelve 365 filas, todo 2026. Si mañana llegan tickets de enero de 2027, la misma expresión pasará a 730 sin que nadie la toque.

Dos columnas que casi siempre faltan

La columna Mes con el nombre en texto se ordena alfabéticamente, así que en un gráfico saldría abril, agosto, diciembre. Para arreglarlo hay que decirle a Power BI que la ordene por Número de mes, desde la opción de ordenar por columna.

La segunda es Es laborable. En una mesa de servicio, dividir los tickets entre los días del mes engaña, porque los fines de semana casi no hay actividad. Con esa columna se puede calcular la media sobre días hábiles, que es la cifra que de verdad sirve para dimensionar el equipo.

Marcar la tabla como tabla de fechas

Queda un paso que se olvida a menudo. En la inteligencia de tiempo clásica hay que marcar explícitamente la tabla, con la opción «Marcar como tabla de fechas», señalando cuál es la columna de fecha. Con la inteligencia de tiempo basada en calendario que Microsoft recomienda ahora no es obligatorio, salvo en casos concretos.

Marcarla no cuesta nada y evita resultados inesperados, así que conviene hacerlo siempre. Al marcarla, Power BI además retira los calendarios automáticos asociados a esa tabla.

Los acumulados del año

Con el calendario listo y relacionado con Tickets[FechaApertura], la primera medida de tiempo es el acumulado:

Tickets acumulados = TOTALYTD ( [Tickets], Calendario[Fecha] )

Horas acumuladas   = TOTALYTD ( [Horas],   Calendario[Fecha] )
MesTicketsTickets acumuladosHoras acumuladas
Julio431431735,0
Agosto3968271.396,5
Septiembre4131.2402.108,5

El acumulado de septiembre coincide con el total del trimestre porque el modelo no tiene datos anteriores a julio. En un año completo, en cambio, arrastraría también los seis primeros meses.

Comparar con el periodo anterior

Es la comparación que pide toda dirección, y se resuelve con DATEADD dentro de la función que modifica el contexto de filtro:

Tickets del mes anterior =
CALCULATE ( [Tickets], DATEADD ( Calendario[Fecha], -1, MONTH ) )

Variación mensual =
DIVIDE (
    [Tickets] - [Tickets del mes anterior],
    [Tickets del mes anterior]
)
MesTicketsMes anteriorVariación
Julio431(en blanco)(en blanco)
Agosto396431−8,1 %
Septiembre413396+4,3 %

Julio sale en blanco, y está bien que salga: no hay junio en el modelo. Inventar un cero ahí produciría una caída falsa del cien por cien, que es justo el tipo de cifra que destruye la confianza en un tablero.

Ahora bien, la lectura de esa tabla tiene truco. Septiembre parece recuperarse un 4,3 %, pero tiene un día menos que agosto. Mirando tickets por día, julio hizo 13,9 y septiembre 13,8: prácticamente lo mismo. Agosto, con 12,8, fue el mes realmente flojo. Esa es la diferencia entre comparar totales y comparar ritmos.

La media móvil de treinta días

Para suavizar el ruido diario se usa una ventana móvil. DATESINPERIOD la construye contando hacia atrás desde la última fecha del contexto:

Tickets últimos 30 días =
CALCULATE (
    [Tickets],
    DATESINPERIOD ( Calendario[Fecha], MAX ( Calendario[Fecha] ), -30, DAY )
)

Media diaria móvil = DIVIDE ( [Tickets últimos 30 días], 30 )

Al 30 de septiembre, la ventana cubre el mes entero: 413 tickets, es decir, 13,8 diarios. Conviene usar MAX y no LASTDATE del hecho, porque así la ventana sigue existiendo aunque el último día no tenga actividad.

Contar por fecha de cierre

El caso tiene dos fechas por ticket y, como Power BI solo admite una relación activa, la de cierre quedó inactiva. Para usarla hay que activarla dentro de la medida:

Tickets cerrados =
CALCULATE (
    [Tickets],
    USERELATIONSHIP ( Calendario[Fecha], Tickets[FechaCierre] )
)

Ahora el mismo informe puede mostrar en un gráfico los tickets abiertos por mes y en otro los cerrados por mes. La diferencia entre ambas series es la cola de trabajo que se arrastra, y suele explicar por qué un equipo se siente desbordado aunque la entrada no haya subido.

Cuando el año fiscal no empieza en enero

CALENDARAUTO admite un parámetro opcional: el mes en que termina el ejercicio. Si la empresa cierra en junio, la llamada correcta es CALENDARAUTO ( 6 ), y entonces los años generados irán de julio a junio.

Ese detalle cambia por completo los acumulados. Con ejercicio natural, el acumulado de septiembre del caso arrastra desde enero; con cierre en junio, arrastra desde julio y vale exactamente 1.240. Conviene fijarlo antes de publicar, porque corregirlo después obliga a reexplicar todos los números ya distribuidos.

Errores frecuentes

ErrorSíntomaCorrección
Cargar solo el rango con datosLos acumulados fallanAños completos
Usar la fecha del hecho como ejeFaltan los días sin actividadPoner el eje en la tabla de fechas
Dejar la fecha y hora automáticaCalendarios ocultos y modelo pesadoDesactivarla
No ordenar el mes por su númeroAbril, agosto, diciembre…Ordenar por columna
Rellenar con ceros el periodo sin datosCaídas falsas del 100 %Dejar el valor en blanco
Dos relaciones activas a la misma tablaPower BI no lo permiteUSERELATIONSHIP o dimensión duplicada

El segundo es el más común y el más difícil de ver, porque el gráfico se dibuja igual de bien. Solo cuando alguien busca un día concreto y no aparece, se descubre que el eje estaba puesto sobre el hecho.

En resumen: la tabla de fechas en cuatro reglas

Una tabla de fechas correcta tiene años completos, días consecutivos y valores únicos; se genera mejor con CALENDARAUTO; se marca como tal; y lleva al menos las columnas de mes ordenado y día laborable. Con eso, los acumulados, las variaciones y las medias móviles del caso salen en cuatro medidas cortas.

El modelo ya calcula. Falta mostrarlo sin que nadie lo malinterprete, que es el asunto de la cuarta guía: qué gráfico elegir para cada pregunta y cómo formatearlo. Para el trabajo previo de limpieza, la referencia sigue siendo la guía de Power Query.

Y si lo que necesita es que alguien administre las licencias, los usuarios y los accesos de Microsoft 365 sobre los que corre todo esto, esa es la conversación de nuestro servicio de gestión de plataformas.

Compartir este artículo

Últimas entradas

Escríbanos ahora