如何在 Power BI 的日期层次结构中包含“时间”

Mik*_*ons 8 datetime data-modeling powerbi

我正在 Power BI 中处理一份报告。我的数据模型中的一个表收集传感器数据。它具有以下列:

  • 串行(int) 即 123456789
  • 时间戳(日期时间)即 12/20/2016 12:04:23 PM
  • 读数(十进制)即 123.456

每隔几分钟就会添加一条新记录,其中包含传感器的当前读数。

Power BI 自动为日期时间列创建层次结构,其中包括年、季度、月和日。因此,当您向报告添加视觉对象时,您可以轻松深入到每个级别。

我想在层次结构中包含数据的“时间”部分,以便您可以在“天”之后再向下钻取一层,并查看该时间段的详细读数。

我已经使用 CALENDARAUTO() 函数设置了一个日期表,添加了所有适当的列,并将其与我的读数表相关联,以便按日期汇总数据 - 效果很好。但它不包括“时间”维度。

我查看了以下 SO 问题,但它们没有帮助:

由 Azure 数据仓库提供支持的 Power BI 中基于时间的钻取

在 PowerBI 中创建时间因素

我也找到了这篇文章,但它令人困惑:

Power BI 日期和时间维度工具包

有任何想法吗?

谢谢!

小智 5

不幸的是,我无法对之前的答案发表评论,因此我必须将其添加为单独的答案:

是的,有一种方法可以自动生成日期和时间表。这是我在报告中使用的一些示例代码:

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
Run Code Online (Sandbox Code Playgroud)

只需将其粘贴到空查询中即可。该代码使用了一个名为 startDate 的参数,因此您需要确保有类似的内容。

这是时间表的片段:

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
Run Code Online (Sandbox Code Playgroud)

如果您在事实表中使用 DateKey 和 TimeKey(如第一个答案中建议的那样),则只需将时间元素放在可视化中的日期元素下方,就可以轻松生成日期/时间层次结构,例如此 日期-时间层次


rag*_*aga 5

我的方法是使用给定的公式创建新列:

<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")
Run Code Online (Sandbox Code Playgroud)

这将创建一个新列,现在您可以使用 your-datetime-column 选择它以创建向下钻取效果。


Leo*_*ard 4

您将需要单独的日期和时间表。您不想将时间放入日期表中,因为时间每天都会重复。

时间维度与日期维度的原理相同,只不过不是每天一行,而是每分钟或每秒一行(取决于您想要的精确程度 - 我不建议包括秒,除非您绝对需要它,因为它大大增加了您需要的行数 - 影响性能)。时间表中不会提及日期。

例如

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
...      | ...      | ...  | ...    | ...
Run Code Online (Sandbox Code Playgroud)

我添加了时间/文本列,因为 Power BI 习惯将 1899 年以来的日期添加到时间数据类型。如果其他列对您也有帮助,您可以添加它们。

在事实表中,您需要将日期时间列拆分为单独的日期和时间列,以便可以将日期连接到日期表,将时间连接到时间表。该时间可能需要转换为最接近的分钟或秒,以便数据中的每个时间都对应于时间表中的一行。

保留但隐藏数据中的原始日期时间字段是值得的,以防您以后想要计算跨天的持续时间。

在 Power BI 中,您可以在轴上的月/日属性下添加时间属性(或小时(和分钟)属性),以制作可以从年 > 季度 > 月 > 日 > 小时 > 进行钻取的柱形图。分钟。Power BI 不关心属性来自不同的表。

您可以在此处阅读有关时间维度的更多信息:http ://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/

希望这可以帮助。