如何在 Power BI 的日期层次结构中包含 'Time'
How to include 'Time' in Date Hierarchy in Power BI
我正在 Power BI 中处理报表。我的数据模型中的 table 之一收集传感器数据。它有以下列:
- 序列号(整数)即 123456789
- 时间戳(日期时间)即 12/20/2016 12:04:23 PM
- 读数(十进制)即 123.456
每隔几分钟添加一条新记录,其中包含传感器的当前读数。
Power BI 自动为日期时间列创建层次结构,其中包括年、季度、月和日。因此,当您向报表添加视觉对象时,您可以轻松深入到每个级别。
我想把"Time"部分的数据纳入层级,方便大家在"Day"之后再往下钻一层,看看那段时间的详细阅读。
我已经使用 CALENDARAUTO() 函数设置了日期 table,添加了所有适当的列,并将其与我的读数 table 相关联,以便通过以下方式汇总数据日期 - 效果很好。但它不包括 "Time" 维度。
我查看了以下 SO 问题,但没有帮助:
Time-based drilldowns in Power BI powered by Azure Data Warehouse
Creating time factors in PowerBI
我也找到了这篇文章,但是看得一头雾水:
Power BI Date & Time Dimension Toolkit
有什么想法吗?
谢谢!
您需要单独的日期和时间 tables。你不想把时间放到日期里table,因为时间每天都重复
时间维度与日期维度的原理相同,除了不是每天一行,而是每分钟或每秒一行(取决于您想要的精确度 - 我不会'除非你绝对需要,否则不建议包括第二个,因为它会大大增加你需要的行数 - 影响性能)。在时间 table 中将不会引用日期。
例如
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
... | ... | ... | ... | ...
我添加了一个 time/text 列,因为 Power BI 习惯于将 1899 年的日期添加到时间数据类型。如果其他栏目对您也有帮助,您可以添加它们。
事实上 table,您需要将日期时间列拆分为单独的日期和时间列,以便您可以将日期连接到日期 table 并将时间连接到时间table。时间可能需要转换为最接近的分钟或秒,以便数据中的每个时间都对应于时间中的一行 table。
值得保留但隐藏数据中的原始日期时间字段,以防您以后想要计算跨天的持续时间。
在 Power BI 中,您将在轴上的 month/day 属性下添加时间属性(或小时(和分钟)属性)以制作可以从年 > 季度钻取的柱形图> 月 > 日 > 小时 > 分钟。 Power BI 不关心属性来自不同的 tables。
您可以在此处阅读有关时间维度的更多信息:http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
希望对您有所帮助。
很遗憾,我无法对之前的答案发表评论,因此我必须将其添加为单独的答案:
是的,有一种方法可以自动生成日期和时间表。这是我在报告中使用的一些示例代码:
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 的参数,因此您要确保您有类似的东西。
这是暂时的片段-table:
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
如果您在 fact-table 中使用 DateKey 和 TimeKey(如第一个答案中的建议),只需将时间元素放入可视化中即可轻松生成 date/time-hierarchy在这样的日期元素下方
date-time-hierarchy
我的方法是使用给定的公式创建新列:
<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")
这将创建一个新列,现在您可以 select 它与 your-datetime-column 一起创建向下钻取效果。
我创建了一个新的自定义列并设置公式=[时间戳]并将类型更改为日期时间。
#"Added Custom" = Table.AddColumn(#"Added Conditional Column16", "TestTimestamp", each [Timestamp]),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom",{{"TestTimestamp", type datetime}}),
我正在 Power BI 中处理报表。我的数据模型中的 table 之一收集传感器数据。它有以下列:
- 序列号(整数)即 123456789
- 时间戳(日期时间)即 12/20/2016 12:04:23 PM
- 读数(十进制)即 123.456
每隔几分钟添加一条新记录,其中包含传感器的当前读数。
Power BI 自动为日期时间列创建层次结构,其中包括年、季度、月和日。因此,当您向报表添加视觉对象时,您可以轻松深入到每个级别。
我想把"Time"部分的数据纳入层级,方便大家在"Day"之后再往下钻一层,看看那段时间的详细阅读。
我已经使用 CALENDARAUTO() 函数设置了日期 table,添加了所有适当的列,并将其与我的读数 table 相关联,以便通过以下方式汇总数据日期 - 效果很好。但它不包括 "Time" 维度。
我查看了以下 SO 问题,但没有帮助:
Time-based drilldowns in Power BI powered by Azure Data Warehouse
Creating time factors in PowerBI
我也找到了这篇文章,但是看得一头雾水:
Power BI Date & Time Dimension Toolkit
有什么想法吗?
谢谢!
您需要单独的日期和时间 tables。你不想把时间放到日期里table,因为时间每天都重复
时间维度与日期维度的原理相同,除了不是每天一行,而是每分钟或每秒一行(取决于您想要的精确度 - 我不会'除非你绝对需要,否则不建议包括第二个,因为它会大大增加你需要的行数 - 影响性能)。在时间 table 中将不会引用日期。
例如
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
... | ... | ... | ... | ...
我添加了一个 time/text 列,因为 Power BI 习惯于将 1899 年的日期添加到时间数据类型。如果其他栏目对您也有帮助,您可以添加它们。
事实上 table,您需要将日期时间列拆分为单独的日期和时间列,以便您可以将日期连接到日期 table 并将时间连接到时间table。时间可能需要转换为最接近的分钟或秒,以便数据中的每个时间都对应于时间中的一行 table。
值得保留但隐藏数据中的原始日期时间字段,以防您以后想要计算跨天的持续时间。
在 Power BI 中,您将在轴上的 month/day 属性下添加时间属性(或小时(和分钟)属性)以制作可以从年 > 季度钻取的柱形图> 月 > 日 > 小时 > 分钟。 Power BI 不关心属性来自不同的 tables。
您可以在此处阅读有关时间维度的更多信息:http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
希望对您有所帮助。
很遗憾,我无法对之前的答案发表评论,因此我必须将其添加为单独的答案:
是的,有一种方法可以自动生成日期和时间表。这是我在报告中使用的一些示例代码:
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 的参数,因此您要确保您有类似的东西。
这是暂时的片段-table:
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
如果您在 fact-table 中使用 DateKey 和 TimeKey(如第一个答案中的建议),只需将时间元素放入可视化中即可轻松生成 date/time-hierarchy在这样的日期元素下方 date-time-hierarchy
我的方法是使用给定的公式创建新列:
<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")
这将创建一个新列,现在您可以 select 它与 your-datetime-column 一起创建向下钻取效果。
我创建了一个新的自定义列并设置公式=[时间戳]并将类型更改为日期时间。
#"Added Custom" = Table.AddColumn(#"Added Conditional Column16", "TestTimestamp", each [Timestamp]),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom",{{"TestTimestamp", type datetime}}),