如何在 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 查询中显示最近六个月的数据(每个月一行)?

Power BI 如何实现具有组织结构层级的RLS、及多条件RLS

power bi如何抓取连续的分秒

power bi HR 数据分析