DAX/PowerBI系列 - 關於時間系列 - 如何用腳本生成時間維度 (Generate TIME Dimension)


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM