在 Power BI 中创建简单且图表友好的日期表

本文翻译自国际Power BI大师Marco Russo的文章——《Creating a simpler and chart-friendly Date table in Power BI》,通过利用自定义格式字符串来充分控制图表的可视化和排序顺序,Power BI中的日期表可以具有较少的列数。

创建一个经典的日期表

日期表通常含有月份和星期之类的列,这些列应按照日期顺序排列-而不能对日期和月份使用首字母排序。为此,我们创建两列:具有可见名称的一列,该列由包含数字的另一列排序。例如,在以下DAX计算表中,月份按月份编号排序:


Classic Date =

VAR FirstYear = -- Customizes the first year to use

YEAR ( MIN ( Sales[Order Date] ) )

RETURN

ADDCOLUMNS (

FILTER (

CALENDARAUTO (),

YEAR ( [Date] ) >= FirstYear

),

"Year", YEAR ( [Date] ),

"Year Month", FORMAT ( [Date], "mmm yyyy" ),

"Year Month Number", YEAR ( [Date] ) * 12 + MONTH ( [Date] ),

"Month", FORMAT ( [Date], "mmm" ),

"Month Number", MONTH ( [Date] ),

"Day of Week", FORMAT ( [Date], "ddd" ),

"Day of Week Number", WEEKDAY ( [Date], 1 )

)

在先前的代码中,月份(Jan, Feb, …)有12个名称,年份-月份有12个名称(Jan 2008, Feb 2008, …, Dec 2008, Jan 2009, Feb 2009, …)。

年份-月份对于创建类似于下图的图表很有用。

如果折线图有限的区域中包含许多数据点,则底部会显示为滚动条。实际上,因为X轴包含文本而不是数字,所以它是分类类型的。在“使用DAX改进Power BI中的时序折线图”一文中,我们展示了如何在日期表中创建其他列以设置X轴上的连续类型。该附加列包含每个时间段的第一天或最后一天,以折线图表示。这种方法的唯一缺点是,日期表中需要增加属性的数量,但结果却是我们所期望的:所有数据点在折线图中都是可见的,没有滚动条,而X轴根据可用的空间调整描述的密度。

创建更简单的日期表

随着Power BI中自定义格式字符串的最新引入,我们可以使用另一种方法,该方法不再需要其他列,并且还不需要使用“按列排序”。基本思想是,我们总是存储日期,例如年,月或周。自定义格式字符串显示我们要在用户界面中看到的文本;但是,由于基础数据是数字,因此我们会自动获得正确的排序顺序,并能够在折线图的X轴上使用“连续类型”。

这是我们对日期表的新定义:

Date =

VAR FirstYear = -- Customizes the first year to use

YEAR ( MIN ( Sales[Order Date] ) )

RETURN

ADDCOLUMNS (

FILTER (

CALENDARAUTO (),

YEAR ( [Date] ) >= FirstYear

),

"Year", DATE ( YEAR ( [Date] ), 12, 31 ),

"Year Month", EOMONTH ( [Date], 0 ),

"Month", FORMAT ( [Date], "mmm" ),

"Month Number", MONTH ( [Date] ),

"Day of Week", FORMAT ( [Date], "ddd" ),

"Day of Week Number", WEEKDAY ( [Date], 1 )

)

如果没有正确的列格式,那么年和年-月列的结果将难以读取:分别是一年中的最后一天和月份中的最后一天。

可以在图表视图中修改列的自定义格式字符串属性。例如,这是应用于年-月列的自定义格式。

我们将以下格式应用于日期表的日期时间数据类型列:

日期:m / dd / yyyy(1/14/2008),用作标记为日期表的列
年:yyyy(2008)
年-月:mmm yyyy(2008年1月)

我们仍然使用经典方法,将文本列和数字列用于“月”和“周”属性的排序顺序。这是因为我们不太可能对这两个属性使用连续折线图。带有格式化列的表如下。


即使格式语法与FORMAT函数支持的格式语法相似,您也必须注意一些区别和限制。例如,没有语法可显示日期的四分之一数字。您可以在Microsoft文档中找到有关支持的自定义格式语法的所有详细信息。

(文档链接:https://docs.microsoft.com/en-us/power-bi/create-reports/desktop-custom-format-strings#supported-custom-format-syntax

注意:如果您想在格式化字符串中应用前缀,则在每个常量字符之前使用反斜杠字符(),而这些字符不必被解释为自定义格式字符串。例如,对于具有财年的列,应使用表达式\ F \ Y yyyy,以便获得2008财政年度的结果。

Date表具有层次结构,即使这不会对格式产生副作用:

日历:年(年),月(年-月),日期(日期)

通过使用新的日期表,我们获得以下矩阵,其中“年月”和“月”列显示所需的文本而不是基础日期。


这种方法的另一个优点是,如果您为DAX计算操纵过滤器上下文,则不必担心按列排序所使用的附加列。

当我们使用折线图导航“年-月”列时,我们得到了想要的结果。

局限性和其他见解

在代表年和月(包括年)的列中使用日期数据类型是一种控制显示格式并继续使用折线图X轴上的分类类型的便捷方法。不幸的是,我们不能对刻(15分钟)使用这种技术,因为自定义格式语法不支持刻(15分钟)。因此,对于日历层次结构的刻(15分钟)级别,我们应该使用两列的经典方法:一列包含字符串(如Q1-2008),一列包含排序顺序。仅当使用自动提供正确排序顺序的命名约定(例如2008-Q1而不是Q1-2008)时,才可以避免使用其他排序列。

当在带有日期时间数据类型的“年”和“年-月”之类的列上使用“处于中间”条件的切片器时,即使基础粒度是按年或月,该切片器也会始终显示所有可能的日期。如果相应的日期在该范围内,则选择将仅包括整个月或全年,但是可视化可能会误导报表用户。

在前面的示例中,我们继续对“月”和“周”属性使用两列方法。不管日期表中的年数如何,这些列分别仅包含12和7个值。因此,不可能定义相应的日期,因为一月份汇总了日期表中所有年份一月份的日期。

但是,可以为所有一月日期分配一个任意日期,为所有星期一分配另一个日期。通过正确设置自定义格式字符串,用户将看不到差异,并且对于这些属性,模型仅需要一列而不是两列。尽管这可以简化过滤上下文的操作,并且可以被认为是更“优雅”的解决方案,但实际上,它并没有为最终用户提供真正的优势。当将“月份”或“周”属性之一应用于折线图时,默认情况下,他们将看到任意日期。在这种情况下,应将“ X轴类型”从“连续”更改为“分类”,以恢复正确的可视化效果。因为本文的目的是简化与报表用户的交互,所以我们在建议的解决方案中未使用此方法。

结论

通过使用自定义格式字符串,较简单的日期表的列数可以减少。如果您操作过滤器上下文,则删除按列排序要求也可以简化DAX代码。只有一种警告与Power BI和DAX中FORMAT函数使用的格式语法之间的细微差别有关。使用Microsoft文档中支持的自定义格式语法作为Power BI的参考。

  • PowerPivot工坊原创文章,转载请注明出处!

    如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊