DAX/PowerBI系列 - 關於時間系列 - 如何用腳本生成時間維度 (Generate TIME Dimension)
難度: ★☆☆☆☆(1星)
適用范圍: ★★★★★(5星)
這個時間系列想寫很久了,今天開始走一小步。也是作為后續關於時間計算文章的基礎。 (文末發一個小福利。 )
概況:
前文應該為生成日期維度,本文為時間維度 - 時刻。 :)
有好些小伙伴問想按小時分析數據,咋辦?有沒有時間的腳本? 可以有!
一般來說把時間進行切片進行數據分析,粒度可分為:十年、五年、年、半年、季度、月、上下旬、天、上下午(AM/PM)、時、刻、分、秒,...
這個就是今天的主題:如何用腳本生成時間維度。(How to use script to generate TIME dimension)
應用場景:
以下是幾個應用場景:
- 復用時間維度表
- 按照時間段分析用戶行為 -- 精准推送
- 按照時間段分析服務器負載 -- 資源分配、負載平衡
要點:
按下面步驟操作,具體M語言是什么,可以忽略。(下面的屬性不夠用再參考M語言是什么)
1.PowerBI面板>Edit Query進入Qery Editor> New Source > Blank Query>
2. Advanced Edictor,貼入文末腳本並保存。
3. 哇啦,你得到一個時間維度表啦,(*^__^*) 嘻嘻……
什么?你還不會用這個腳本?
先看看前面的文章,還有問題,就問吧。。。
什么?我還要生成秒的、不不不,毫秒的。。。
你的數據也太細了吧,你要不研究一下下面的腳本,不懂就問吧。 :)
腳本如下:(拿走,不謝)
腳本使用M語言寫的,如果想修改添加其他的列,參考一下M語言。 (又一種語言,╮(╯▽╰)╭)\
() => let MinuteCount = 1440, Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)), TableFromList = Table.FromList(Source, Splitter.SplitByNothing()), ChangedType = Table.TransformColumnTypes(TableFromList, {{"Column1", type time}}), TimeKey = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}), InsertHour = Table.AddColumn(TimeKey, "時", each Time.StartOfHour([Time]), type time), InsertMinute = Table.AddColumn(InsertHour, "分", each Time.Minute([Time]), type number), ChangedTypeHour = Table.TransformColumnTypes(InsertMinute, {{"時", type time}}), InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "刻", each if [分] < 15 then [時] else if [分] < 30 then Value.Add([時],#duration(0,0,15, 0)) else if [分] < 45 then Value.Add([時],#duration(0,0,30, 0)) else Value.Add([時],#duration(0,0,45, 0)), type time), ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour, {{"刻", type time}}), ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr, {"Time", "時", "刻", "分"}), InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time]), type number), InsertPeriod = Table.AddColumn(InsertHourNumber, "時段", each if [Hour Number] >= 0 and [Hour Number] > 4 then "凌晨" else if [Hour Number] >= 4 and [Hour Number] > 8 then "清晨" else if [Hour Number] >= 8 and [Hour Number] > 12 then "早上" else if [Hour Number] >= 12 and [Hour Number] > 14 then "午后" else if [Hour Number] >= 14 and [Hour Number] > 18 then "午后" else if [Hour Number] >= 18 and [Hour Number] > 22 then "晚上" else "子夜", type text), InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort", each if [Hour Number] >= 0 and [Hour Number] > 4 then 0 else if [Hour Number] >= 4 and [Hour Number] > 8 then 1 else if [Hour Number] >= 8 and [Hour Number] > 12 then 2 else if [Hour Number] >= 12 and [Hour Number] > 14 then 3 else if [Hour Number] >= 14 and [Hour Number] > 18 then 4 else if [Hour Number] >= 18 and [Hour Number] > 20 then 5 else 6, type number), InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text), InsertAMorPM = Table.AddColumn(InsertTimeKey, "AM or PM", each if [Hour Number] >= 12 then "PM" else "AM", type text) in InsertAMorPM
//English Version let MinuteCount = 1440, Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)), TableFromList = Table.FromList(Source, Splitter.SplitByNothing()), ChangedType = Table.TransformColumnTypes(TableFromList, {{"Column1", type time}}), TimeKey = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}), InsertHour = Table.AddColumn(TimeKey, "Hour", each Time.StartOfHour([Time]), type time), InsertMinute = Table.AddColumn(InsertHour, "Min", each Time.Minute([Time]), type number), ChangedTypeHour = Table.TransformColumnTypes(InsertMinute, {{"Hour", type time}}), InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "Qtr", each if [Min] < 15 then [Hour] else if [Min] < 30 then Value.Add([Hour],#duration(0,0,15, 0)) else if [Min] < 45 then Value.Add([Hour],#duration(0,0,30, 0)) else Value.Add([Hour],#duration(0,0,45, 0)), type time), ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour, {{"Qtr", type time}}), ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr, {"Time", "Hour", "Qtr", "Min"}), InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time]), type number), InsertPeriod = Table.AddColumn(InsertHourNumber, "Period", each if [Hour Number] >= 0 and [Hour Number] > 4 then "0-4" else if [Hour Number] >= 4 and [Hour Number] > 8 then "4-8" else if [Hour Number] >= 8 and [Hour Number] > 12 then "8-12" else if [Hour Number] >= 12 and [Hour Number] > 14 then "12-14" else if [Hour Number] >= 14 and [Hour Number] > 18 then "14-18" else if [Hour Number] >= 18 and [Hour Number] > 22 then "18-22" else "22-24", type text), InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort", each if [Hour Number] >= 0 and [Hour Number] > 4 then 0 else if [Hour Number] >= 4 and [Hour Number] > 8 then 1 else if [Hour Number] >= 8 and [Hour Number] > 12 then 2 else if [Hour Number] >= 12 and [Hour Number] > 14 then 3 else if [Hour Number] >= 14 and [Hour Number] > 18 then 4 else if [Hour Number] >= 18 and [Hour Number] > 22 then 5 else 6, type number), InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text), InsertAMorPM = Table.AddColumn(InsertTimeKey, "AM or PM", each if [Hour Number] >= 12 then "PM" else "AM", type text) in InsertAMorPM