2.5Jerarquías y tabla de fechas (calendario)
Lo esencial en 30 segundos
- El análisis temporal exige una tabla de fechas dedicada: una fila por día, continua, vinculada a la fecha de los hechos y marcada como tabla de fechas.
- Se genera en DAX: CALENDARAUTO() (barre las fechas del modelo) o CALENDAR(inicio; fin) (límites explícitos).
- Se ordenan los meses por una columna numérica (NumMes) y se construye la jerarquía Año → Trimestre → Mes → Día para hacer cada visual explorable.
Mini-caso continuo — Zineb construye EL calendario de su modelo
Zineb, controladora de gestión en una pyme agroalimentaria de Argel, quiere seguir la evolución mensual de la cifra de negocio, pero sus meses se muestran desordenados (abril antes que enero). Aplica la sección: crea una tabla de fechas dedicada Fechas = CALENDARAUTO(), añade Año, Mes, NumMes y Trimestre, ordena Mes por NumMes, vincula Fechas[Fecha] a Ventas[Fecha] y luego Marca como tabla de fechas. Por último crea la jerarquía Año → Trimestre → Mes → Día y la usa en su curva de evolución: aparecen los botones de exploración. Anota el reflejo: desactivar la jerarquía de fechas automática de Power BI.
Caso autónomo de esta sección: reaparece en el curso, el esquema, el guion y el reto de 48 h de la sección 2.5.
1. La tabla de fechas dedicada
El análisis temporal — evolución, acumulados, comparación N-1 — exige una base: la tabla de fechas dedicada. Una dimensión calendario con una fila por día, continua en el periodo, sus columnas Año/Trimestre/Mes/Día, marcada como «tabla de fechas» y vinculada a los hechos. Sin ella, la inteligencia de tiempo no funciona de forma fiable; con ella, todo se vuelve simple. Zineb la genera en DAX: CALENDARAUTO() o CALENDAR(inicio; fin).
2. Ordenar los meses
Error clásico: «abril» se ordena antes que «enero» en alfabético. Se arregla ordenando la columna Mes por una columna numérica NumMes (Herramientas de columna → Ordenar por columna). Zineb siempre crea NumMes = MONTH(Fechas[Fecha]) junto a su rótulo de mes.
3. Jerarquía y un solo calendario
Después se construye la jerarquía Año → Trimestre → Mes → Día, que hace cada visual temporal explorable (drill down). Y una sola tabla de fechas sirve a todo el modelo: todos los análisis temporales se conectan a ella. Zineb desactiva la jerarquía de fechas automática de Power BI, que crea una tabla oculta por columna y engorda el archivo.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — El calendario en DAX
Zineb genera y completa su tabla de fechas:
Fechas = CALENDARAUTO()
Año = YEAR(Fechas[Fecha])
Mes = FORMAT(Fechas[Fecha], "mmmm")
NumMes = MONTH(Fechas[Fecha]) // sirve para ordenar Mes
Trimestre = "T" & QUARTER(Fechas[Fecha])
→ vincular Fechas[Fecha] a Ventas[Fecha], y luego Marcar como tabla de fechas.
Lectura: «T» & QUARTER(Fechas[Fecha]) concatena «T» y el número de trimestre (T1, T2…).
Lección: NumMes existe únicamente para ordenar Mes correctamente en los visuales.
Vocabulario de la sección
- Tabla de fechas
- Dimensión calendario: una fila por día, continua en el periodo, vinculada a la fecha de los hechos — la base temporal.
Ejemplo sencillo: Zineb crea la tabla Fechas vinculada a Ventas[Fecha].
Lo que no es: fechas dispersas en la tabla de hechos, sin calendario.
Reflejo: análisis temporal → una tabla de fechas dedicada.
- CALENDARAUTO / CALENDAR
- Las funciones DAX que generan el calendario: CALENDARAUTO() barre las fechas del modelo; CALENDAR(inicio; fin) las fija.
Ejemplo sencillo: Zineb escribe Fechas = CALENDARAUTO() para empezar.
Lo que no es: una lista de fechas introducida a mano.
Reflejo: modelo limpio → CALENDARAUTO; límites controlados → CALENDAR.
- Marcar como tabla de fechas
- El ajuste oficial (herramientas de tabla) que activa el buen comportamiento de las funciones de inteligencia de tiempo.
Ejemplo sencillo: Zineb marca Fechas como tabla de fechas tras haberla vinculado.
Lo que no es: una tabla de fechas sin marcar, ignorada por la inteligencia de tiempo.
Reflejo: tabla de fechas construida → marcarla oficialmente.
- Jerarquía
- Año → Trimestre → Mes → Día: la exploración por niveles en los visuales (botones de drill).
Ejemplo sencillo: Zineb explora su curva de año en mes por drill down.
Lo que no es: un solo nivel plano, imposible de explorar.
Reflejo: hacer los visuales temporales explorables → jerarquía.
- Ordenar por columna
- Se ordena la columna Mes (rótulo) por la columna NumMes (Herramientas de columna → Ordenar por columna).
Ejemplo sencillo: Zineb obtiene enero, febrero… y no abril, enero.
Lo que no es: un orden alfabético de los meses, erróneo.
Reflejo: mes mostrado → ordenarlo por su número.
En la práctica — En la práctica — Construir EL calendario del modelo
- Nueva tabla (vista Tabla → Nueva tabla): Fechas = CALENDARAUTO(), como Zineb.
- Añada las columnas: Año = YEAR(Fechas[Fecha]); Mes = FORMAT(Fechas[Fecha]; "mmmm"); NumMes = MONTH(Fechas[Fecha]); Trimestre = "T" & QUARTER(Fechas[Fecha]).
- Ordene Mes por NumMes (Herramientas de columna → Ordenar por columna), vincule Fechas[Fecha] a Ventas[Fecha] y luego Marque como tabla de fechas.
- Cree la jerarquía (clic derecho en Año → Nueva jerarquía, añada Trimestre, Mes) y úsela en su curva de evolución: aparecen los botones de exploración.
Guion paso a paso — construir el calendario como Zineb (10 min)
1) Nueva tabla: Fechas = CALENDARAUTO(). 2) Añada Año = YEAR(Fechas[Fecha]), Mes = FORMAT(Fechas[Fecha], "mmmm"), NumMes = MONTH(Fechas[Fecha]) y Trimestre = "T" & QUARTER(Fechas[Fecha]). 3) Ordene Mes por NumMes (Herramientas de columna → Ordenar por columna). 4) Vincule Fechas[Fecha] a Ventas[Fecha] y luego Marque como tabla de fechas. 5) Cree la jerarquía Año → Trimestre → Mes y pruebe el drill down en una curva. 6) Desactive la jerarquía de fechas automática en Opciones.
Si hay fechas parásitas (1900, fechas de nacimiento) rondando por el modelo, prefiera CALENDAR(inicio; fin) a CALENDARAUTO().
Plantilla copiar-pegar — mi calendario DAX
Fechas = CALENDARAUTO()
Año = YEAR(Fechas[Fecha])
Mes = FORMAT(Fechas[Fecha], "mmmm")
NumMes = MONTH(Fechas[Fecha])
Trimestre = "T" & QUARTER(Fechas[Fecha])
[ ] Ordenar Mes por NumMes [ ] Vincular Fechas[Fecha] → Ventas[Fecha]
[ ] Marcar como tabla de fechas [ ] Jerarquía Año → Trimestre → Mes → Día
Generar el calendario
Zineb escribe Fechas = CALENDARAUTO(): una fila por día que cubre las fechas del modelo.
Ordenar los meses
Zineb ordena Mes por NumMes: enero, febrero, marzo… y no abril, enero.
Marcar la tabla
Zineb vincula Fechas a las ventas y luego la Marca como tabla de fechas: la inteligencia de tiempo se activa.
Explorar por jerarquía
Zineb arrastra la jerarquía Año → Mes a una curva: el drill down revela cada nivel.
✓ Buenas prácticas
- Crear una sola tabla de fechas, continua y marcada oficialmente.
- Ordenar los meses por una columna numérica («Ordenar por columna»).
- Construir la jerarquía Año → Mes para hacer los visuales explorables.
✗ Errores frecuentes
- Contentarse con la jerarquía de fechas automática (tabla oculta por columna).
- Olvidar ordenar Mes por NumMes (orden alfabético erróneo).
- Usar CALENDARAUTO con fechas parásitas (1900, nacimiento).
Puntos clave
- Una tabla de fechas dedicada, continua, marcada oficialmente: no negociable para el análisis temporal.
- El orden de los meses pasa por una columna numérica: «Ordenar por columna» es el reflejo.
- La jerarquía Año → Mes hace cada visual temporal explorable (drill down).
- Una sola tabla de fechas para todo el modelo: todos los análisis temporales se conectan a ella.
Reto de 48 h — aplíquelo mañana
Construya el calendario de Zineb: cree Fechas = CALENDARAUTO(), añada Año/Mes/NumMes/Trimestre, ordene Mes por NumMes, vincule Fechas[Fecha] a Ventas[Fecha] y Marque la tabla como tabla de fechas. Termine con una jerarquía Año → Mes probada en una curva.
- Genero una tabla de fechas (CALENDARAUTO o CALENDAR).
- Ordeno los meses por NumMes y marco la tabla como tabla de fechas.
- Construyo una jerarquía Año → Mes y exploro en drill down.
Preguntas frecuentes
¿No basta la jerarquía de fechas automática de Power BI?
Saca del apuro en un archivo pequeño, pero crea una tabla de fechas oculta por columna de fecha (lo que engorda el archivo), y no permite ni orden personalizado de los meses ni análisis temporal limpio. Los profesionales la desactivan (Opciones → Carga de datos → Fecha/hora automática) en favor de una tabla de fechas dedicada, única, que controlan por entero.
CALENDARAUTO o CALENDAR: ¿cuál elegir?
CALENDARAUTO() barre todas las fechas presentes en el modelo y genera un calendario que las cubre: práctico y sin ajuste. CALENDAR(DATE(2024;1;1); DATE(2026;12;31)) fija límites explícitos. Se prefiere CALENDAR cuando hay fechas parásitas (una fecha de nacimiento, un valor 1900) rondando por el modelo: CALENDARAUTO generaría entonces un calendario inmenso y engordaría el archivo.
¿Qué exige la inteligencia de tiempo (evolución, acumulados, N-1)?