如何在 Power BI 的日期层次结构中包含“时间”
Posted
技术标签:
【中文标题】如何在 Power BI 的日期层次结构中包含“时间”【英文标题】:How to include 'Time' in Date Hierarchy in Power BI 【发布时间】:2017-05-08 12:12:20 【问题描述】:我正在处理 Power BI 中的报表。我的数据模型中的一张表收集传感器数据。它有以下列:
序列号(整数)即 123456789 时间戳(日期时间)即 12/20/2016 12:04:23 PM 读数(十进制)即 123.456每隔几分钟就会添加一条新记录,其中包含传感器的当前读数。
Power BI 自动为日期时间列创建层次结构,其中包括年、季度、月和日。因此,当您向报表添加视觉对象时,您可以轻松深入到每个级别。
我想在层次结构中包含数据的“时间”部分,以便您可以在“日”之后再向下钻取一层,并查看该期间的详细读数。
我已经使用 CALENDARAUTO() 函数设置了一个日期表,添加了所有适当的列,并将其与我的读数表相关联,以便按日期汇总数据 - 这很有效。但它不包括“时间”维度。
我查看了以下 SO 问题,但没有帮助:
Time-based drilldowns in Power BI powered by Azure Data Warehouse
Creating time factors in PowerBI
我也找到了这篇文章,但是很混乱:
Power BI Date & Time Dimension Toolkit
有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:很遗憾,我无法评论上一个答案,所以我必须将其添加为单独的答案:
是的,有一种方法可以自动生成日期和时间表。这是我在报告中使用的一些示例代码:
let
Source = List.Dates(startDate, Duration.Days(DateTime.Date(DateTime.LocalNow()) - startDate)+1, #duration(1,0,0,0)),
convertToTable = Table.FromList(Source, Splitter.SplitByNothing(), "Date", null, ExtraValues.Error),
calcDateKey = Table.AddColumn(convertToTable, "DateKey", each Date.ToText([Date], "YYYYMMDD")),
yearIndex = Table.AddColumn(calcDateKey, "Year", each Date.Year([Date])),
monthIndex = Table.AddColumn(yearIndex, "MonthIndex", each Date.Month([Date])),
weekIndex = Table.AddColumn(monthIndex, "WeekIndex", each Date.WeekOfYear([Date])),
DayOfWeekIndex = Table.AddColumn(weekIndex, "DayOfWeekIndex", each Date.DayOfWeek([Date], 1)),
DayOfMonthIndex = Table.AddColumn(DayOfWeekIndex, "DayOfMonthIndex", each Date.Day([Date])),
Weekday = Table.AddColumn(DayOfMonthIndex, "Weekday", each Date.ToText([Date], "dddd")),
setDataType = Table.TransformColumnTypes(Weekday,"Date", type date, "DateKey", type text, "Year", Int64.Type, "MonthIndex", Int64.Type, "WeekIndex", Int64.Type, "DayOfWeekIndex", Int64.Type, "DayOfMonthIndex", Int64.Type, "Weekday", type text)
in
setDataType
只需将其粘贴到空查询中即可。该代码使用了一个名为 startDate 的参数,因此您需要确保有类似的东西。
这是时间表的 sn-p:
let
Source = List.Times(#time(0,0,0) , 1440, #duration(0,0,1,0)),
convertToTable = Table.FromList(Source, Splitter.SplitByNothing(), "DayTime", null, ExtraValues.Error),
createTimeKey = Table.AddColumn(convertToTable, "TimeKey", each Time.ToText([DayTime], "HHmmss")),
hourIndex = Table.AddColumn(createTimeKey, "HourIndex", each Time.Hour([DayTime])),
minuteIndex = Table.AddColumn(hourIndex, "MinuteIndex", each Time.Minute([DayTime])),
setDataType = Table.TransformColumnTypes(minuteIndex,"DayTime", type time, "TimeKey", type text, "HourIndex", Int64.Type, "MinuteIndex", Int64.Type)
in
setDataType
如果您在事实表中使用 DateKey 和 TimeKey(如第一个答案中建议的那样),您只需将时间元素放在日期元素下方的可视化中即可轻松生成日期/时间层次结构,例如这 date-time-hierarchy
【讨论】:
【参考方案2】:您需要单独的日期和时间表。您不想将时间放入日期表中,因为时间每天都在重复。
时间维度与日期维度的原则相同,除了不是每天一行,而是每分钟或每秒都有一行(取决于您想要的精确度 - 我不推荐包括第二个,除非您绝对需要它,因为它大大增加了您需要的行数 - 影响性能)。时间表中不会提及日期。
例如
Time | Time Text| Hour | Minute | AM/PM
---------|----------|------|--------|------
12:00 AM | 12:00 AM | 12 | 00 | AM
12:01 AM | 12:01 AM | 12 | 01 | AM
12:02 AM | 12:02 AM | 12 | 02 | AM
... | ... | ... | ... | ...
我包含一个时间/文本列,因为 Power BI 习惯于将 1899 年的日期添加到时间数据类型。如果它们对您也有帮助,您可以添加其他列。
在您的事实表中,您需要将日期时间列拆分为单独的日期和时间列,以便您可以将日期连接到日期表并将时间连接到时间表。时间可能需要转换为最接近的分钟或秒,以便数据中的每个时间都对应于时间表中的一行。
值得保留但将原始日期时间字段隐藏在数据中,以防您以后想要计算跨天的持续时间。
在 Power BI 中,您可以在轴上的月/日属性下添加时间属性(或小时(和分钟)属性),以制作可以从年 > 季度 > 月 > 日钻取的柱形图> 小时 > 分钟。 Power BI 并不关心属性来自不同的表。
您可以在此处阅读有关时间维度的更多信息:http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
希望这会有所帮助。
【讨论】:
谢谢。有没有办法自动生成这个时间表?还是必须手动填充? 老实说,我通常将它放在 Excel 中并从那里加载。如果有帮助的话,有一些脚本可以在 SQL 中生成这样的表(例如sqlblog.com/blogs/louis_davidson/archive/2010/02/04/…)。奇怪的是,似乎没有多少人提供预制的。【参考方案3】:我的方法是使用给定的公式创建新列:
<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")
这将创建一个新列,现在您可以使用 your-datetime-column 选择它以创建向下钻取效果。
【讨论】:
哇!我只需要一个小时的深入研究,这很容易,谢谢【参考方案4】:我创建了一个新的自定义列并设置了 formula=[Timestamp] 并将类型更改为 datetime。
#"Added Custom" = Table.AddColumn(#"Added Conditional Column16", "TestTimestamp", each [Timestamp]),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom","TestTimestamp", type datetime),
【讨论】:
以上是关于如何在 Power BI 的日期层次结构中包含“时间”的主要内容,如果未能解决你的问题,请参考以下文章
Power BI Advanced编辑器如何获取SelectedRow的文本?
Power BI中有一列日期有多个是相同的,如何在表中的X轴上全部显示出来
如何根据 Power BI 报表中选定的月份筛选器在 MDX 查询中显示最近六个月的数据(每个月一行)?