Compartir a través de


Implementación de cálculos basados en tiempo en Power BI

Power BI ofrece varias herramientas para realizar cálculos basados en el tiempo, que se basan en tablas de fechas automáticas o tablas de fechas que agregue.

Se recomienda usar la inteligencia de tiempo basada en calendarios (versión preliminar) porque proporciona el mejor rendimiento y la gama más alta de flexibilidad para satisfacer cualquier calendario.

En esta tabla se comparan las tres herramientas proporcionadas:

Tool Esfuerzo de instalación necesario Facilidad de administración Flexibilidad Notas
Fecha y hora automáticas prácticamente cero duro Bajo Aumenta el tamaño del modelo debido a varias tablas de fechas ocultas creadas
Inteligencia de tiempo clásica medium fácil Bajo Requiere la creación de una tabla de fechas, supone que el calendario gregoriano o el calendario gregoriano desplazado sufren problemas de rendimiento en algunos escenarios específicos.
Inteligencia de tiempo basada en calendarios Alto medium Alto Se recomienda crear una tabla de fechas, mayor flexibilidad, mejor rendimiento, pero mayor costo de instalación

Nota:

Desaconsejamos usar técnicas de inteligencia de tiempo alternativas, particularmente aquellas que implican agregar columnas adicionales a tablas de fechas para calcular desplazamientos, excepto para casos de uso específicos. Aunque estos enfoques pueden atraer a los principiantes debido a sus fórmulas DAX sencillas, tienden a inflar modelos semánticos innecesariamente. Este sobredimensionamiento puede provocar actualizaciones de datos más lentas y reducir el rendimiento del informe a medida que crecen los conjuntos de datos.

Fecha y hora automáticas

La característica de fecha y hora automática crea automáticamente tablas de fechas ocultas para cada campo de fecha del modelo de datos. Para obtener más información sobre este comportamiento automático, consulte Aplicación de la fecha y hora automáticas en Power BI Desktop.

Nota:

Aunque la fecha y hora automáticas es una opción cómoda para los modelos simples, no se recomienda para escenarios más complejos y modelos más grandes. Para esos modelos, es preferible crear una tabla dedicada para obtener más flexibilidad.

Agregar una tabla de fechas

Para la mayoría de los modelos, se recomienda agregar una tabla de fechas (o más en algunos escenarios). Muchos analistas de datos prefieren crear sus propias tablas de fechas, lo que es correcto.

Hay varias maneras de crear una tabla de este tipo, entre las que se incluyen:

La mejor opción para usted depende de varios factores y está fuera del ámbito de este tutorial.

Trabajar con cálculos temporales

Suponiendo que no usa la fecha y hora automáticas, hay dos formas alternativas de trabajar con funciones de inteligencia de tiempo en Power BI para realizar cálculos basados en tiempo:

  • Inteligencia de tiempo clásica. La opción más sencilla y funciona bien para los calendarios gregorianos o desplazados, pero tiene una flexibilidad limitada para los calendarios estructurados de forma diferente o para los cálculos basados en semanas.
  • Inteligencia de tiempo basada en calendarios (versión preliminar). Opción más reciente, pero requiere un poco más de trabajo para configurar. Sin embargo, también proporciona un mejor rendimiento, más flexibilidad para trabajar con calendarios no gregorianos y la capacidad de realizar cálculos basados en semanas.

Nota:

Debe establecer la tabla como una tabla de fechas para escenarios específicos.

Inteligencia de tiempo clásica

Esta opción requiere que tenga una tabla de fechas en el modelo y establecerla en consecuencia. Después, puede usar las funciones de inteligencia de tiempo y hacer referencia a la tabla de fechas. Por ejemplo, si tiene una tabla de fechas denominada Date en el modelo que estableció como tabla de fechas, que contiene una columna Date, puede usar:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Aunque se trata de un enfoque rápido y sencillo, hay muchas desventajas en comparación con el enfoque basado en calendarios:

  • requiere que establezcas la tabla de fechas.
  • solo funciona con modelos que tienen al menos una tabla de fechas dedicada.
  • Las columnas de fecha usadas no deben tener fechas que falten entre las fechas primera y última. Si faltan fechas entre las primeras y las últimas fechas, se produce un error.
  • es menos flexible, ya que está optimizado para calendarios gregorianos o calendarios gregorianos desplazados, como los años fiscales que comienzan el 1 de julio pero aún siguen un calendario gregoriano.
  • no proporciona cálculos basados en semanas
  • en escenarios específicos, los cálculos basados en el tiempo no funcionan bien.

Nota:

Se recomienda usar el enfoque mejorado basado en calendarios .

Inteligencia de tiempo basada en calendarios (versión preliminar)

Los calendarios son definiciones de metadatos agregadas a una tabla para indicar qué columnas de esa tabla representan los atributos de tiempo. Puede definir uno o varios calendarios en cualquier tabla del modelo. Después de definir el calendario en el modelo, puede hacer referencia a él en las funciones de inteligencia de tiempo. Por ejemplo, aquí se muestra cómo calcular un año total hasta la fecha de ventas mediante un calendario fiscal definido:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Ventajas de la inteligencia de tiempo basada en calendarios

Las principales ventajas de la inteligencia de tiempo basada en calendarios son:

Funciona con cualquier calendario

Los calendarios ofrecen flexibilidad total para decidir cómo dividir el tiempo en años, trimestres, meses y semanas. Por ejemplo, puede definir los calendarios que siguen estos patrones:

  • Gregorian
  • Gregoriano desplazado
  • Venta al por menor (445, 454, 544 patrones)
  • 13 meses
  • Lunar

Las posibilidades son infinitas, ya que no hay ninguna suposición integrada de Power BI sobre cómo se estructura el calendario. La inteligencia de tiempo basada en calendarios no supone ninguna suposición sobre las fechas subyacentes. Todos los cálculos utilizan los datos subyacentes tal cual.

Fechas dispersas

La inteligencia de tiempo clásica requiere que se complete la columna de fecha proporcionada: si faltan fechas entre las fechas primera y última, se produce un error. Las funciones de inteligencia de tiempo basadas en calendario no tienen este requisito. En su lugar, operan en las fechas tal cual. Aunque se recomienda tener una tabla de calendario completa y dedicada, ya no es necesario que lo tenga. Por ejemplo, si todas las tiendas minoristas están cerradas durante el fin de semana, puede omitir los días de fin de semana, ya que no tienen ventas. Suponiendo que su fin de semana sea sábado y domingo, ahora puede usar PREVIOUSDAY con un calendario basado en una tabla que no tenga entradas para el fin de semana y saltar directamente de lunes a viernes.

Cálculos basados en semanas

La inteligencia temporal basada en el calendario proporciona directamente funciones DAX que operan a nivel de granularidad semanal. Por ejemplo, los totales de semana a fecha se pueden calcular directamente mediante TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Mejoras de rendimiento

Algunos escenarios pueden mostrar un rendimiento mejorado al comparar una función de inteligencia de tiempo basada en calendario con su homólogo clásico. Por ejemplo, un objeto visual agrupado por la semana y realiza un cálculo de año a fecha mediante TOTALYTD ( ..., CalendarName ) , por lo general, debería ejecutarse más rápidamente que si se usara su homólogo clásico, TOTALYTD ( ..., TableName[DateColumnName] ), . Para obtener información sobre por qué esto puede ocurrir, consulte la sección Borrado de contexto .

Habilitar la versión preliminar mejorada de Inteligencia de Tiempo de DAX

Para empezar, primero debe habilitar la función de vista previa de Inteligencia de Tiempo de DAX Mejorada.

  1. En Power BI Desktop, vaya a Opciones de archivo > y configuración > Opciones > Características de vista previa.
  2. Seleccione la vista previa de Inteligencia de Tiempo de DAX mejorada.
  3. Seleccione Aceptar
  4. Reinicio de Power BI Desktop

Administrar calendarios

Para administrar un calendario, haga clic con el botón derecho en la tabla que contiene el calendario o en el que desea definir el calendario y elija Opciones de calendario o seleccione Opciones de calendario en la cinta Herramientas de tabla después de seleccionar la tabla:

Captura de pantalla que muestra los puntos de entrada para abrir las opciones de calendario en una tabla.

Como alternativa, puede usar herramientas externas o la vista TMDL para definir un calendario. Para obtener más información, consulte el script TMDL.

Los calendarios también se muestran en el explorador de modelos en la tabla en la que se definen:

Captura de pantalla que muestra el explorador de modelos para un modelo semántico. El nodo Tabla de fechas se expande y los calendarios están resaltados.

Pantalla de opciones de calendario

La pantalla de opciones de calendario muestra los calendarios definidos en la tabla seleccionada. Aquí puede:

  • para crear un calendario nuevo, seleccione Nuevo calendario.
  • editar un calendario existente seleccionando Editar
  • eliminar un calendario existente seleccionando Eliminar
  • establezca la tabla como una tabla de fechas seleccionando Marcar como tabla de fechas.

Captura de pantalla que muestra las opciones de calendario en una tabla.

Asignar categorías de columna

Definir un calendario implica asignarle un nombre y asignar columnas a categorías. Cada categoría representa una unidad de tiempo y hay categorías de columna específicas disponibles. Debe asignar al menos una columna principal a una categoría para guardar el calendario. Cada categoría debe tener una columna principal y puede tener cero o más columnas asociadas. Cada vez que las columnas asociadas a una categoría están en contexto, Power BI sabe qué unidad de tiempo presentan. Además, para algunas funciones, como TOTALMTD Power BI, usa la columna principal asignada a la categoría pertinente del calendario al que se hace referencia para realizar el cálculo solicitado. Para asignar una columna a una categoría, seleccione la categoría en el menú Agregar categoría y, a continuación, seleccione las columnas principales y opcionales asociadas.

Captura de pantalla que muestra la pantalla de creación y edición del calendario.

Categorías de columna disponibles

En la tabla siguiente se muestran las categorías disponibles. La tabla también proporciona valores de ejemplo y cardinalidades para calendarios gregorianos.

Las categorías se dividen en dos grupos:

  • Completado. Los datos de las columnas asignadas a Categorías completas son suficientes para identificar de forma única el período de tiempo.
  • Parcial. Los datos de las columnas asignadas a categorías parciales no son suficientes para identificar de forma única el período de tiempo.
Categoría Description Tipo Cardinalidad de ejemplo en un calendario gregoriano Valores de columna de ejemplo en un calendario gregoriano
Año El año Completo Y = número de años 2024, 2025
Trimestre El trimestre que incluye el año Completo 4*Y primer trimestre de 2024, segundo trimestre de 2025
Trimestre del año Trimestre del año Parcial 4 Primer trimestre del año, YQ1, Q1, Trimestre 2
Mes El mes con el año incluido Completo 12*Y ≤ value ≤ 13*Y Enero de 2023, febrero de 2024
Mes del año Mes del año Parcial 12 Enero, Año Mes 11, YM11, M11, 11
Mes del trimestre Mes del trimestre Parcial 3 1, QM2
Week La semana, incluido el año Completo 52 ≤ value ≤ 53 Semana 50 de 2023, W50-2023, 2023-W50
Semana del año La semana del año Parcial 52 Semana 50, W50, 50
Semana del trimestre La semana del trimestre Parcial 13 Semana del trimestre 10, QW10, 10
Semana del mes La semana del mes Parcial 5 Mes: Semana 2, MW2, 2
Fecha Fecha Completo 365*Y ≤ value ≤ 366*Y 31/12/2025
Día del año Día del año Parcial 365 ≤ value ≤366 365, D1
Día del trimestre El día del trimestre Parcial 92 Cuarto día 10, QD2, 50
Día del mes Día del mes Parcial 31 Día del mes 30, MD10, 30
Día de la semana El día de la semana Parcial 7 Día 5 de la semana, WD5, 5

Además de estas categorías, puede asociar cualquier número de columnas de la tabla a la categoría relacionada con el tiempo . Esto no es posible actualmente en las opciones de calendario, sino que solo se puede hacer con herramientas externas o TMDL.

Nota:

Se quita el contexto de las columnas asignadas a la categoría relacionada con el tiempo al realizar cálculos en todas las funciones excepto DATEADD y SAMEPERIODLASTYEAR. Cualquier contexto de las columnas que forman parte de la tabla en la que se define el calendario, pero que no están etiquetadas en ese calendario, se mantiene.

Nota:

Se recomienda asociar solo las columnas del calendario que quiera usar en los cálculos de inteligencia temporal.

Columnas principales frente a asociadas

La columna principal es necesaria para cada categoría. Cada vez que esa columna o cualquier columna asociada asignada a la misma categoría del calendario al que se hace referencia están en contexto o la categoría es necesaria para realizar un cálculo, Power BI usa la columna principal. Además, las columnas principales se usan para ordenar. Si los valores de la columna principal no permiten que se puedan ordenar según lo previsto, puede configurar la columna principal para ordenar por otra columna o usar otra columna y convertir la columna original en una columna asociada. Por ejemplo, una columna con datos textuales que contienen el número de mes y el año en un formato de mm-yyyy (es decir, 01-2024, 02-2024, etc.) no se ordenará correctamente en varios años, pero una columna que use el yyyy-mm formato hará lo siguiente:

Captura de pantalla que muestra dos tablas. Cada tabla tiene una columna. La primera tabla contiene una columna que contiene información textual de número de mes y año en formato mm-aaaa y la segunda contiene la misma información en formato aaaa-mm. La columna que contiene los datos de formato mm-aaaa no se ordena correctamente.

Puede tener cero o más columnas asociadas asignadas a una categoría.

Validation

Es importante validar y probar el calendario para que esté seguro de que satisface sus necesidades. Las validaciones que se ofrecen en Power BI incluyen validaciones en tiempo real y validaciones sin conexión.

Nota:

Puede guardar el calendario a pesar de los errores de validación sin conexión, pero se recomienda resolverlos primero. Los fallos de validación en tiempo real deben corregirse para poder guardarlos.

Validaciones en tiempo real

Las validaciones en tiempo real realizadas en los calendarios son:

  • Nombre de calendario único. Cada calendario debe tener un nombre único en el modelo semántico.
  • Asociación única por calendario. Una columna no puede pertenecer a más de una categoría en el mismo calendario.
  • Unicidad del período. Las categorías asignadas deben identificar de forma única el período.
  • Categorización coherente. Esto garantiza que las columnas estén asociadas a la misma categoría entre calendarios.

Unicidad del período

Siempre debe haber una ruta de acceso para identificar de forma única el período de las categorías asignadas.

Siempre que agregue una categoría parcial, Power BI valida que también se etiqueta una combinación coincidente de categorías completas o parciales en el mismo calendario. Si no es así, se muestra una advertencia.

Captura de pantalla que muestra la pantalla de creación y edición del calendario con un error de validación en tiempo real.

Por ejemplo, al configurar un calendario para cálculos basados en semanas, asegúrese de asignar al menos una columna principal a uno de los siguientes conjuntos de categorías:

  • Week
  • Semana del año, Año
  • Semana del trimestre, trimestre
  • Semana del trimestre, trimestre del año, año
  • Semana del mes, mes
  • Semana del mes, mes del año, año
  • Semana del mes, mes del trimestre, trimestre
  • Semana del mes, mes del trimestre, trimestre del año, año

Categorización coherente

Las columnas deben tener una categoría uniforme en todos los calendarios. No se puede asignar la misma columna a categorías diferentes, como Year, Quarter of Year o time-related en calendarios independientes.

Validaciones sin conexión

Las validaciones sin conexión pueden llevar mucho tiempo porque acceden a los datos de la tabla. Por lo tanto, no se ejecutan automáticamente en contraste con las validaciones en tiempo real. Para ejecutar las validaciones, seleccione Validar datos:

Captura de pantalla que muestra la pantalla de creación y edición del calendario. El botón Validar datos está resaltado.

Las validaciones sin conexión comprueban las reglas siguientes y devuelven una advertencia si alguna regla se invalida en el calendario:

  • Una columna asociada a una categoría no tiene valores en blanco.
  • Las categorías jerárquicas de nivel superior e inferior tienen una relación de cardinalidad de uno a varios. Por ejemplo, las columnas asociadas a la categoría Año deben tener una cardinalidad de uno a varios con las columnas asociadas a la categoría Mes.
  • las columnas asociadas a categorías del mismo nivel tienen una relación de cardinalidad uno a uno. Por ejemplo, las columnas asociadas con la categoría Mes deben tener una cardinalidad uno por uno con las combinaciones de las columnas asociadas con las categorías Mes del Año y Año.
  • las columnas principales y asociadas asignadas a la misma categoría tienen una relación de cardinalidad uno a uno. Por ejemplo, al asignar a la categoría Mes, la columna principal "Month" y la columna asociada "EnglishMonthName" deberían tener una cardinalidad de uno a uno.

Trabajar con calendarios

Una vez definido un calendario, puede hacer referencia a él en Funciones de inteligencia de tiempo. Por ejemplo, la siguiente medida calcula un valor total de mes a la fecha de la Cantidad Total con respecto al calendario ISO-454.

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

Si el calendario no está definido y se devuelve el error:

Captura de pantalla que muestra una medida mediante la TOTALMTD función con un parámetro de calendario a un calendario inexistente.

Aunque se defina el calendario, una medida podría aún devolver un error. Esto sucede si la función usada espera que una categoría esté presente en el calendario y el calendario no tiene esa categoría. Por ejemplo, TOTALWTD espera que las categorías específicas estén presentes en el calendario. Si no lo son, se devuelve un error:

Captura de pantalla que muestra una medida mediante la TOTALWTD función con una referencia de calendario válida que no define las categorías necesarias.

Funciones de inteligencia temporal y categorías requeridas

Muchas funciones de inteligencia de tiempo requieren que se incluyan categorías suficientes en el calendario al que se hace referencia en la llamada de función para que Power BI pueda identificar una unidad de tiempo única. Es decir, Power BI debe ser capaz de ascender desde el nivel en el que se realiza el cálculo hasta llegar a un año individual. Por ejemplo, al realizar un cálculo en trimestres, mediante TOTALQTD asignar la categoría Trimestre o asignar ambos Trimestre del Año y Año en el calendario según lo dictado por la validación de singularidad del período.

Nota:

Para algunas funciones, su nombre es indicativo de qué nivel funciona el cálculo (por ejemplo, TOTALYTD), mientras que para otros depende de los parámetros y el contexto (por ejemplo, DATEADD).

Eliminación de contexto

Las funciones de inteligencia de tiempo operan comenzando en un punto en el tiempo y, a continuación, realizan alguna operación en él para obtener un punto en el tiempo diferente. Naturalmente, el momento inicial en el tiempo puede entrar en conflicto con este resultado, lo que provoca una intersección de contexto de filtro que, de forma predeterminada, produciría resultados parciales o vacíos. Por ejemplo, tenga en cuenta el siguiente caso.

Definición del calendario

Tenemos un calendario gregoriano sencillo que etiqueta tres categorías, definidas como:

Categoría Columna principal
Año Año
Mes del año MesDelAño
Trimestre Trimestre

Definiciones de medida

Se definen dos medidas básicas: una para calcular las ventas totales y otra para calcular las ventas totales del trimestre anterior:

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

Ejemplo: Funcionamiento del borrado de contexto

El objeto visual de tabla navega a nivel de granularidad mensual utilizando las columnas Year y MonthOfYear :

Año MesDelAño TotalSales VentasDelÚltimoTrimestre
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

En esta tabla, la fila en negrita muestra un nivel mensual del mes de abril de 2011. Por lo tanto, todas las medidas de esta fila se evaluarán en el contexto de filtro de [Year] == 2011 y [MonthOfYear] == 4.
Como se esperaba, TotalSales aquí se calcula como las ventas totales de abril de 2011.

LastQuarterSales calcula de forma similar TotalSales, pero dado un filtro adicional proporcionado por la DATEADD función basada en calendario. Para esta fila, DATEADD tendría un punto inicial en el tiempo de abril de 2011 y determinaría el punto en el tiempo que es exactamente hace un trimestre: enero de 2011. Como resultado, puede esperar que se calcule este TotalSales en los dos contextos de filtro siguientes:

  • Proporcionado por las columnas de exploración de la fila actual: { [Year] == 2011, [MonthOfYear] == 4 } (Equivalente a abril de 2011)
  • Proporcionado por el DATEADD filtro: { [Year] == 2011, [MonthOfYear] == 1 } (Equivalentemente, enero de 2011)

Claramente, estos dos contextos de filtro entrarían en conflicto: no se pueden evaluar las ventas totales dado el mes actual como enero de 2011 y abril de 2011. Esta intersección no produciría ningún resultado. Sin embargo, esto no es lo que ocurre. En su lugar, en función de la definición del calendario, las funciones de inteligencia de tiempo basadas en calendario identifican qué columnas de categorías pueden dar lugar a conflictos, después de la operación de hora que realiza la función. En este caso, DATEADD lleva a cabo un desplazamiento al nivel de Trimestre. La función identifica que las categorías Year y Month of Year pueden cambiar como resultado de un cambio en las columnas de la categoría Quarter . Por lo tanto, la función borra el contexto de filtro en todas las columnas (primarias y asociadas) etiquetadas en esas categorías.

En otras palabras, podemos decir que las categorías Año y Mes de Año son dependencias de la categoría Trimestre . Por el contrario, podemos decir que la categoría Quarter es dependiente de las categorías Year y Month of Year .

Cómo funciona el borrado de contexto

Diagrama de estructura lattice de todas las categorías de calendario.

Este diagrama se proporciona para visualizar mejor las dependencias entre las distintas categorías de tiempo. Cada categoría de este entramado representa todas las columnas (principal y asociadas) etiquetadas en esa categoría. Las categorías están conectadas a sus dependencias a través de flechas. Por ejemplo, "Mes" depende de "Año", "Trimestre del Año", "Mes del Trimestre", "Trimestre" y "Mes del Año".

Cuando el contexto se establece en una columna o en su ordenación asociada por columna etiquetada en un calendario, se borra el contexto de filtro anterior en:

  1. Todas las dependencias de categoría de X. Esto puede considerarse como todas las categorías anteriores a X.
  2. Todas las categorías dependientes de X y sus dependencias (es decir, de 1 anterior). Esto puede considerarse como todas las categorías inferiores a X y todas las categorías por encima de 1.

Nota:

La limpieza de contexto se produce en las columnas etiquetadas en un calendario o en las columnas de ordenación asociadas, independientemente de cómo se establezca el contexto mediante funciones de inteligencia de tiempo u otros métodos.

La mayoría de las funciones de inteligencia de tiempo, excepto para DATEADD y SAMEPERIODLASTYEAR, borrarán el contexto en todas las columnas relacionadas con el tiempo y las columnas de ordenación asociadas.

Comportamiento entre calendarios

Si hay varios calendarios definidos en la misma tabla, estos procesos se completan para cada calendario definido en la tabla. Esto incluye la observación sobre el borrado de contexto de las columnas relacionadas con el tiempo. En otras palabras, supongamos que una tabla define tres calendarios: Calendar1, Calendar2 y Calendar3. Si el contexto de filtro se establece en la categoría "X" en Calendar1, los procesos anteriores se realizan en los tres calendarios.

Ejemplo: Filtro establecido en "Quarter"

Si el contexto de filtro se estableció en la categoría "Quarter", el proceso sería el siguiente.

  1. En primer lugar, se considerarán todas las dependencias de la categoría "Quarter".

    Ejemplo de comportamiento de borrado de contexto de filtro a partir de la categoría Trimestre: Dependencias.

  2. A continuación, se considerarán todos los dependientes de "Quarter" y sus dependencias.

    Ejemplo de comportamiento de borrado del contexto del filtro a partir de la categoría Trimestre: Dependientes.

  3. Por último, el resultado final sería el siguiente. Todas las categorías de color rojo se les quitaría el contexto de filtro anterior y se establecería un nuevo contexto en Trimestre.

    Ejemplo de la eliminación del contexto del filtro comenzando desde la categoría Trimestre: Resultados

Script TMDL para calendarios

createOrReplace

	table Date
		lineageTag: xyz

		column Date
			dataType: dateTime
			formatString: Long Date
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Date

        column Year
			dataType: string
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Year

			annotation SummarizationSetBy = Automatic
        
        column Month
			dataType: string
			lineageTag: def
			summarizeBy: none
			sourceColumn: Month

			annotation SummarizationSetBy = Automatic

        column MonthName
			dataType: string
			lineageTag: ghi
			summarizeBy: none
			sourceColumn: MonthName
			sortByColumn: SortByMonth

			changedProperty = SortByColumn

			annotation SummarizationSetBy = Automatic

        column DutchMonthName
			dataType: string
			lineageTag: jkl
			summarizeBy: none
			sourceColumn: DutchMonthName

			annotation SummarizationSetBy = Automatic

        column 'Holiday Name'
			dataType: string
			lineageTag: mno
			summarizeBy: none
			sourceColumn: Holiday Name

			annotation SummarizationSetBy = Automatic
        
        column IsWorkingDay
			dataType: string
			lineageTag: pqr
			summarizeBy: none
			sourceColumn: IsWorkingDay

			annotation SummarizationSetBy = Automatic
		...	
		
		calendar 'Demo Calendar'
			lineageTag: def

			calendarColumnGroup = year
				primaryColumn: Year

			calendarColumnGroup = month
				primaryColumn: Month
				associatedColumn: DutchMonthName
				associatedColumn: MonthName
			
			calendarColumnGroup
                column: 'Holiday Name'
                column: isWorkingDay

Nota:

Tenga en cuenta que si no especifica ninguna categoría para en calendarColumnGroup TMDL, las columnas se etiquetan como relacionadas con el tiempo. En este ejemplo, Holiday Name y isWorkingDay son columnas relacionadas con el tiempo en el calendario de demostración.

Integrar todo: ejemplos de desplazamiento temporal

Algunas funciones de inteligencia de tiempo solo desplazan el contexto lateralmente, teniendo en cuenta todas las columnas, mientras que otras realizan cambios jerárquicos, manteniendo o borrando el contexto en función de si las columnas se etiquetan en el calendario. Las funciones de inteligencia de tiempo se pueden dividir en dos grupos en función de si permiten cambios jerárquicos:

  • Corregido. Las funciones de este grupo son DATEADD y SAMEPERIODLASTYEAR. Estas funciones solo permiten desplazamientos temporales laterales y no devuelven valores de un nivel de detalle diferente.
  • Flexible. Este grupo contiene todas las demás funciones de inteligencia de tiempo. Estas funciones permiten turnos de tiempo jerárquicos y, en función de la configuración del calendario, pueden devolver resultados de un nivel de detalle diferente.

Para mostrar estos comportamientos, veamos un ejemplo mediante un modelo de datos simple que consta de dos tablas, dos calendarios y cinco medidas.

Tablas y relaciones

En este ejemplo, tenemos el siguiente modelo de datos simple:

Table Columnas
Fecha Año, EsDíaLaboral, Fecha
Ventas Clave de pedido, Cantidad, Fecha de pedido

Estas son algunas filas de ejemplos de la tabla Date : Captura de pantalla que muestra las primeras 14 filas de la tabla Date de ejemplo. La tabla define Date, Year e IsWorkingDay. La columna Date contiene una fecha, la columna Year el valor del año y la columna IsWorkingDay es una columna booleana (True/False) que indica si la fecha es un día laborable o no.

Estas son algunas filas de ejemplo en la tabla Sales : Captura de pantalla que muestra las primeras nueve filas de la tabla Sales de ejemplo. La tabla define OrderKey, OrderDate y Order Quantity. La columna OrderKey contiene un número único para cada pedido de ventas, OrderDate es una fecha que relaciona Sales to Date y Order Quantity es una columna numérica que representa el número de productos de cada pedido.

Las tablas Sales y Date están relacionadas en OrderDate y Date.

Captura de pantalla que muestra la vista de modelo para el modelo de ejemplo. Muestra la tabla Sales and Date y una relación uno a varios entre ellos en OrderDate y Date.

Calendars

En la tabla Date, definimos calendarios con estos mapeos:

NombreDelCalendario Categoría Columna principal
Gregoriano Año Año
Fecha Fecha
GregorianoWithWorkingDay Año Año
Fecha Fecha
Relacionado con el tiempo IsWorkingDay

La definición de TMDL equivalente de estos dos calendarios es:

ref table Date
    calendar 'Gregorian'
        lineageTag: xyz
    
        calendarColumnGroup = year
    	    primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    calendar 'GregorianWithWorkingDay'
    	lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
    
    	calendarColumnGroup = year
    		primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    	calendarColumnGroup
    		column: IsWorkingDay   

Medidas

En la tabla Ventas , definimos las siguientes medidas:

Total Quantity = SUM ( 'Sales'[Order Quantity] )

OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )

OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )

FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )

FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)

Ejemplo de desplazamiento lateral

Vamos a crear un objeto visual que muestre Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity y OneYearAgoQuantityTimeRelated para 2024 y 2025:

Captura de pantalla que muestra un objeto visual de tabla que muestra Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity y OneYearAgoQuantityTimeRelated. Los valores de OneYearAgoQuantity y OneYearAgoQuantityTimeRelated para 2025 coinciden con los valores de 2024 para los mismos valores de IsWorkingDay.

Todos los valores de OneYearAgoQuantity y OneYearAgoQuantityTimeRelated para 2025 coinciden con la cantidad total de exactamente un año antes (2024), para el mismo valor de IsWorkingDay .

Esto muestra que DATEADD mantiene el contexto en cualquier columna de la tabla Date que contiene el calendario usado independientemente de si no está etiquetado o si está etiquetado como relacionado con el tiempo en ese calendario. Puesto que en nuestras definiciones de medida indicamos DATEADD que se retrocediera un año, la única columna cuyo contexto se desplazó fue la columna asociada a la categoría Año. "Si la columna IsWorkingDay estaba etiquetada en el calendario como relacionada con el tiempo o no estaba etiquetada en absoluto, esto no cambió el resultado." La única función que muestra este comportamiento es SAMEPERIODLASTYEAR.

Ejemplo de desplazamiento jerárquico

Ahora, echemos un vistazo a un ejemplo en el que, de hecho, si una columna está etiquetada como relacionada con el tiempo o no cambia el resultado.

Para ello, vamos a volver a crear el mismo objeto visual que en el ejemplo anterior, pero esta vez vamos a usar las medidas FullLastYearQuantity y FullLastYearQuantityTimeRelated: Captura de pantalla que muestra un objeto visual de tabla que muestra Year, IsWorkingDay, Total Quantity, FullLastYearQuantity y FullLastYearQuantityTimeRelated. Los valores de FullLastYearQuantity 2025 coinciden con los valores de 2024 para los mismos valores de IsWorkingDay, pero los valores de FullLastYearQuantityTimeRelated son iguales al valor de cantidad total independientemente de los valores de IsWorkingDay.

Esto muestra que PARALLELPERIOD conserva el contexto de las columnas no etiquetadas en el calendario, pero borra el contexto de los etiquetados como relacionados con el tiempo. FullLastYearQuantity usó el calendario gregoriano donde IsWorkingDay no se etiquetó en el calendario, mientras que FullLastYearQuantityTimeRelated usó el calendario gregorianoWithWorkingDay donde IsWorkingDay se etiquetó como relacionado con el tiempo. Todas las funciones de inteligencia temporal, excepto DATEADD y SAMEPERIODLASTYEAR, funcionan de esta manera.

Bonus: Si realmente quería forzar estas funciones a conservar el contexto de las columnas relacionadas con el tiempo, también puede usar VALUES:

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

En este caso, FullLastYearQuantityTimeRelatedOverride devuelve los mismos resultados que FullLastYearQuantity.

Conclusión

El ejemplo elaborado anterior muestra que las distintas funciones de inteligencia de tiempo se comportan de forma diferente en función de si las columnas se etiquetan como relacionadas con el tiempo en el calendario. DATEADD y SAMEPERIODLASTYEAR solo realizan desplazamientos temporales laterales. Todas las demás funciones de inteligencia de tiempo permiten turnos de tiempo jerárquicos.

Uso DATEADD con calendarios

La función DATEADD tiene parámetros específicos que permiten un control detallado sobre cómo se realizan los desplazamientos cuando la selección está en un nivel más granular que el nivel de desplazamiento indicado por el parámetro interval en DATEADD. Esto sucede, por ejemplo, si muestra datos en el nivel de fecha, pero establece el interval parámetro DATEADD en MONTH. Por ejemplo, en un calendario gregoriano, al desplazar un período que abarca del 3 al 10 de marzo por un mes, el resultado será del 3 al 10 de abril. Sin embargo, dado que los meses en calendarios gregorianos varían de longitud, esto puede provocar ambigüedades al cambiar. A continuación se muestran escenarios de ejemplo basados en un calendario gregoriano:

Cambiar de un período más corto a otro más largo

Por ejemplo, al avanzar un mes con una selección en febrero, el mes objetivo es marzo. Puede usar el extension parámetro para influir en cómo se realiza el desplazamiento:

Valor del parámetro de extensión Description Resultado
precise Esto mantiene estrictamente el intervalo de fechas original. El 25-28 de febrero se desplaza al 25-28 de marzo.
extended Permite que la ventana se expanda hacia el final del mes. El 25-28 de febrero se desplaza al 25-31 de marzo.

Cambiar de un período más largo a otro más corto

Por ejemplo, si se retrocede un mes con una selección en marzo, el mes objetivo es febrero.

Puede usar el truncation parámetro para influir en cómo se realiza el desplazamiento:

Valor del parámetro de truncamiento Description Resultado
anchored Ancla el resultado a la última fecha válida del mes más pequeño. El 31 de marzo se desplaza al 28 de febrero (o 29 en año bisiesto).
blank Cuando una fecha cambiada no existe, devuelva en blanco. Al retroceder un mes desde el 31 de marzo, se devuelve en blanco (ya que el 31 de febrero no existe).

Consideraciones para trabajar con inteligencia de tiempo basada en calendarios

  • Realizar un cálculo de inteligencia temporal en una tabla de hechos que define un calendario y está sujeta a reglas de seguridad a nivel de fila (RLS) puede dar lugar a resultados inesperados.
  • El rendimiento de esta característica en versión preliminar no es representativo del producto final.
  • Todavía no puede crear calendarios en el servicio Power BI.
  • No debe usar tablas de fecha y hora automáticas con calendarios personalizados.
  • No se pueden usar calendarios con modelos compuestos o conectados en directo.
  • Se recomienda asociar solo las columnas del calendario que quiera usar en los cálculos de inteligencia temporal.
  • Los calendarios están sujetos a validaciones en tiempo real y sin conexión . Puede guardar el calendario a pesar de los errores de validación sin conexión, pero se recomienda resolverlos primero. Los fallos de validación en tiempo real deben corregirse para poder guardarlos.
  • Cada calendario debe tener un nombre único en el modelo de datos.
  • Una sola tabla puede contener varios calendarios
  • La tabla que contiene el calendario debe tener menos de 200 columnas. Si la tabla contiene más de 20 000 filas, las validaciones no estarán disponibles, pero todavía puede agregar un calendario.
  • Un calendario debe asignar al menos una columna principal a una categoría.
  • Un calendario solo puede asignar columnas de su propia tabla a categorías
  • Cada categoría debe tener una columna principal y puede tener asignadas cero o más columnas asociadas.
  • DATEADD tiene nuevos parámetros para controlar la extensión y el comportamiento de la extensión, que IntelliSense no reconoce.
  • Cualquier columna determinada se puede asignar solo a una categoría.
  • No se pueden anidar funciones de inteligencia de tiempo que usan calendarios. Por ejemplo, no se admite la siguiente instrucción DAX:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

En su lugar, puede hacer lo siguiente:

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

Creación de una tabla de fechas mediante herramientas integradas

En los ejemplos siguientes se crea una tabla de fechas del 1 de enero de 2010 al 31 de diciembre de 2030 mediante Power Query M o DAX. Incluye las columnas siguientes: Año, Número de Mes, Nombre del Mes, Mes Año, Trimestre, Año Trimestre, Día y Fecha.

Power Query M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

Para obtener más información y más opciones, vea Tablas de fechas.

Para obtener más información relacionada con este artículo, consulte los siguientes recursos: