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

时间:2016-12-22 19:30:18

标签: datetime data-modeling powerbi

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

  • 序列号(int),即123456789
  • 时间戳(日期时间),即2016年12月20日下午12:04:23
  • 阅读(十进制),即123.456

每隔几分钟就会添加一条新记录,当前读数来自传感器。

Power BI会自动为日期时间列创建一个层次结构,其中包括年,季,月和日。因此,当您在报表中添加视觉效果时,可以轻松深入查看每个级别。

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

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

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

Time-based drilldowns in Power BI powered by Azure Data Warehouse

Creating time factors in PowerBI

我也发现了这篇文章,但令人困惑:

Power BI Date & Time Dimension Toolkit

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

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

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

#include <unistd.h>
#include <stdio.h>
int main(void)
{
    char buf[1024];
    ssize_t n;
    while ((n = read(0, buf, sizeof buf)) > 0)
        write(1, buf, n);
    if (n < 0) {
        perror("read");
        return 1;
    }
    return 0;
}

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

这是时间表的摘要:

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

如果您在事实表中使用DateKey和TimeKey(如第一个答案中建议的那样),您可以通过简单地将时间元素放在日期元素下面的可视化中来轻松生成日期/时间层次结构这个 date-time-hierarchy

答案 1 :(得分:2)

你需要单独的日期&amp;时间表。你不想把时间花在日期表上,因为时间每天都在重复。

时间维度与日期维度是相同的主体,除了每天不是一行,每分钟或每秒都会有一行(取决于你想要的精确度 - 我不会&#39;除非你绝对需要,否则建议包括秒,因为它会大大增加你需要的行数 - 影响性能。时间表中没有提及日期。

E.g。

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年的日期添加到时间数据类型中。您可以添加其他列,只要它们对您有帮助。

在您的事实表中,您希望将日期时间列拆分为单独的日期和时间段。时间列,以便您可以将日期加入日期表&amp;到时间表的时间。时间可能需要转换为最接近的圆形分钟或秒,以便数据中的每一次都与时间表中的一行相对应。

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

在Power BI中,您可以在轴上的月/日属性下添加时间属性(或小时(和分钟)属性),以生成可从年份&gt;钻取的柱形图。季度&gt;月份&gt;一天&gt;小时&gt;分钟。 Power BI并不关心属性来自不同的表。

您可以在此处详细了解时间维度:http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/

希望这有帮助。

答案 2 :(得分:1)

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

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

这将创建一个新列,现在您可以在您的datetime列中选择它以创建下钻效果。

答案 3 :(得分:0)

我创建了一个新的自定义列,并将公式设置为[Timestamp],并将类型更改为datetime。

#"Added Custom" = Table.AddColumn(#"Added Conditional Column16", "TestTimestamp", each [Timestamp]),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom",{{"TestTimestamp", type datetime}}),