PowerPivot 中的日期

本节介绍有关如何导入包含日期的数据以及处理关系和数据透视表中日期的最佳做法。

导入日期数据的最佳做法

在您导入具有日期/时间数据的数据时,尤其是在从多个来源导入此类数据时,要导入的数据经常包含不同格式的日期,或者在日期中具有不同级别的粒度。

例如,Excel 提供返回当前日期/时间的两个函数:TODAY 函数返回与 NOW 函数相同的日期,但 TODAY 函数始终返回 12 AM 的默认时间,而 NOW 函数则返回确切时间。

上述情况会造成的问题是,附加时间信息可能会导致值不匹配。 然后,在您尝试对数据透视表中的值求和时,可能会发现不能以期望方式对这些值进行分组。

除了日期具有不同级别的精确度之外,您的数据源可能包括以不同文本格式编写的日期、采用不同区域格式的日期或者基于不同会计年度的日期。

为了处理这些不同类型的日期以及将这些日期集成到单个模型中,在导入数据后,您应该:

  • 在计算列中使用 DAX 公式可以截断值,或者创建一致的日期/时间值的集合。

  • 创建可用于在日期列之间创建关系的主日期/时间表。

下面的部分提供详细信息。

确定对日期的要求。

在更改任何日期值之前,请考虑您计划使用这些数据进行的分析,并就此提出以下问题:

  • 在对数字数据进行计数或分组时,要依据哪个或哪些粒度级别 -- 日、小时、周、季度?

  • 将使用哪些级别的粒度对日期进行分组 -- 周、会计季度等?

  • 是否缺少任何日期? 缺少日期或其他值是否可接受,或者是否需要插入占位符值或日期? 如果缺少值,您是否需要使用零或所选的其他一些值来表示未知值?

使用公式将日期转换为一致的日期格式。

如果您导入的数据包含多种格式的日期,则可以按原样保留列,并且使用 DAX 公式创建计算列,这些计算列表示采用正确格式的日期并且处于指定的粒度级别。

有关示例,请参阅下列主题:

DATE 函数

DATEVALUE 函数

  • 如果需要,使用 DAX 函数可以提取日、年和月之类的值。

  • 使用 DAX 函数可以将值编译成日期/时间格式。

如果日期值未格式化为日期,或者具有不一致的格式,则可以使用在 DAX 中提供的日期和时间函数生成有效日期。

  • 使用 FORMAT 函数可以处理自定义数字或日期/时间格式。

有关日期和时间函数的完整列表,请参阅DAX 函数参考

如果您需要使用日、周和月,则截断时间。

日是 DAX 时间智能函数可以处理的最小时间单位。 因此,如果您无需处理时间值,则应该降低数据的粒度以便使用日作为最小单位。

为了解决具有不必要的确切时间值的问题,您可能需要执行若干事项:

  • 从日期/时间值截断时间,或者使所有日期/时间值都使用相同的默认时间值。

  • 如果您需要处理时间(例如,小时、分钟和秒),则通过使用计算列来创建表示时间增量的单独字段或多个字段。 然后,您可以单独分析时间。

在 PowerPivot 中使用的日期/时间数据类型是 SQL Server 数据类型,默认情况下为每个日期都创建一个时间值。

在导入时筛选数据以便减少错误数据。

如果外部数据包含无效值,则可以在导入时筛选出这些无效数据。 有关详细信息,请参阅以下主题:

使用“表导入向导”添加数据(教程)

更改从数据源导入的行

在数据透视表中处理日期的最佳做法

本节提供的某些技巧可帮助您在使用 DAX 时间智能函数的数据透视表和公式中处理日期。

避免在关系中使用整数代理键。

在您从关系数据源导入外部数据时,日期和时间列常常由代理键表示,这是用于表示唯一日期的整数列。 但在 PowerPivot 工作簿中,您应该避免通过使用整数日期/时间键来创建关系,对于您的键应改用包含具有 date 数据类型的唯一值的列。

尽管使用代理项键在传统的数据仓库中被视作最佳做法,但在 PowerPivot 中不需要整数键,因为这样做可能很难按不同的日期期间对数据透视表中的值进行分组。

创建主日期表。

如果您的工作簿中的每个数据表都包含一列日期/时间值,并且您基于这些日期/时间列关联各表,则可能许多值都将不匹配:例如,您的 Sales 表可能具有仅限 2008 年下半年的日期,而 Suppliers 表则可能列出从 2006 年到 2008 年的日期。

与在包含不同日期和时间的许多独立列的基础上联接不同的数据表相比,您可以通过创建仅存储日期信息的主表来取得更好的结果。 然后,您可以使用关系将该表链接到您的数据表,从而可以得到可供处理的一致的数据集。

注意注意

在创建主日期表时,可将其标记为日期表,这将启用在其他情况下不可用的其他日期筛选器。 有关详细信息,请参阅“标记为日期表”对话框

DAX 示例工作簿提供一个主日期/时间表的示例,该表使用关系连接到其他表。

除了对您要使用的每个日期具有唯一的日期/时间值之外,该主表包含您可以用于对数据透视表中的日期进行分组的层次结构,如下表所示:

DayNumberOfWeek

WeekNumberOfYear

CalendarQuarter

FiscalQuarter

DayNameOfWeek

WeekNumberOfMonth

CalendarSemester

FiscalSemester

DayNumberOfMonth

MonthName

CalendarYear

FiscalYear

DayNumberOfYear

MonthNumberOfYear

  

  

根据需要创建日期列的副本

如果您曾经使用过传统的 Analysis Services 数据库(这些数据库使用日期“维度”来表示日期和对日期进行分组),则应该对主日期表的概念较为熟悉。

PowerPivot 中有别于上述概念之处在于,PowerPivot 表中的每个唯一列只能参与任意两个表之间的一个关系。 因此,如果单个表包含必须与日期键相关的多个列,则您必须创建日期键列和链接的副本。

例如,假定您的 Orders 表包含以下日期列:SalesDateTransactionDateShippingDate。 您想要将所有这些列链接到主日期表中的日期键列,但 PowerPivot 不允许这样做,以便确保任何关系都提供唯一的、明确的通过这些值的路径。 您而是需要将附加的数据列移入单独的表中,然后将每个表中的日期列链接到主日期表中的日期列。 例如,您可能决定在 Orders 表中保留 SalesDate 列,但为交易创建一个新表,为装运信息创建一个单独的表。 您可以使用某一计算列来创建 ShippingDateTransactionDate 列的副本,以便确保它们保持同步。

DAX 示例工作簿提供一个示例,说明如何创建和高效地使用日期列的副本。 有关从哪里获取这些示例的详细信息,请参阅获取 PowerPivot 示例数据

请参阅

概念

数据分析表达式 (DAX) 概述

其他资源

在 PowerPivot 中准备分析数据