Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
- Power Query M. Puede usar la función List.Dates . Se proporciona un ejemplo más adelante en este documento.
- DAX. Puede usar las funciones CALENDAR o CALENDARAUTO para generar una tabla de fechas calculada básica. También puede usar una instrucción DAX más avanzada para crear una tabla de fechas. Se proporciona un ejemplo más adelante en este documento.
- Herramientas externas.
- Cargar desde un origen, como un sistema de origen, un archivo u otro modelo semántico de Power BI.
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
- Fechas dispersas
- Cálculos basados en semanas
- Mejoras en el rendimiento
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.
- En Power BI Desktop, vaya a Opciones de archivo > y configuración > Opciones > Características de vista previa.
- Seleccione la vista previa de Inteligencia de Tiempo de DAX mejorada.
- Seleccione Aceptar
- 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:
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:
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.
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.
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:
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.
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:
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:
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:
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
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:
- Todas las dependencias de categoría de X. Esto puede considerarse como todas las categorías anteriores a X.
- 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.
Columnas relacionadas con el tiempo
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.
En primer lugar, se considerarán todas las dependencias de la categoría "Quarter".
A continuación, se considerarán todos los dependientes de "Quarter" y sus dependencias.
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.
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 :
Estas son algunas filas de ejemplo en la tabla Sales :
Las tablas Sales y Date están relacionadas 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:
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:
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.
Contenido relacionado
Para obtener más información relacionada con este artículo, consulte los siguientes recursos: