首页 文章

如何在Power BI中的日期层次结构中包含'Time'

提问于
浏览
3

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

  • Serial (int),即123456789

  • Timestamp (日期时间),即12/20/2016 12:04:23 PM

  • Reading (十进制)即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

有任何想法吗?

谢谢!

3 回答

  • 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
    ...      | ...      | ...  | ...    | ...
    

    我包含一个时间/文本列,因为Power BI习惯于将1899年的日期添加到时间数据类型中 . 如果它们对您有帮助,您可以添加其他列 .

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

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

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

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

    希望这可以帮助 .

  • 2

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

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

    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的参数,因此您需要确保具有类似的内容 .

    这是时间表的片段:

    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中来轻松生成日期/时间层次结构 .

  • 1

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

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

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

相关问题