關於時間序列的計算是一個很(也)常(很)用(大)的topic,而且應用範圍很廣,譬如計算同比,環比,根據時間序列預測某個值。必不可少的就是在模型裡面有一個日期的維度。 ...
跟大家的交流是我的動力。 :)
DAX/PowerBI系列 - 關於時間系列 - 如何用腳本生成時間維度 (Generate Date Dimension)
難度: ★☆☆☆☆(1星)
適用範圍: ★★★★★(5星)
這個時間系列想寫很久了,今天開始走一小步。也是作為後續關於時間計算文章的基礎。 (文末發一個小福利。 )
概況:
關於時間序列的計算是一個很(也)常(很)用(大)的topic,而且應用範圍很廣,譬如計算同比,環比,根據時間序列預測某個值。必不可少的就是在模型裡面有一個日期的維度。
PowerBI提供了一個AutoCalendar的函數來生成一個日期的時間表,很好!但它僅此生成一個日期列。
可素,往往我們需要很多其他的日期屬性列,譬如:單獨的年,月,日,季度,財年,等等。我們可以添加計算列,把它們一個一個加進來,但是我另外一個model也需要這個時間維度表呢?
重覆添加計算列,這個活真的比較無趣。有沒有什麼好方法去避免吶?
這個就是今天的主題:如何用腳本生成時間維度。(How to use script to generate date dimension)
應用場景:
以下是幾個應用場景:
- 復用時間維度表
- 偷懶不想一個個添加時間屬性列
最終PowerBI效果顯示如下:
要點:
按下麵步驟操作,具體M語言是什麼,可以忽略。(下麵的屬性不夠用再參考M語言是什麼)
1.PowerBI面板>Edit Query進入Qery Editor> New Source > Blank Query>
2. Advanced Edictor,貼入文末腳本並保存。
3.填入參數,點[Invoke]
4.哇啦,你得到一個時間維度表啦,(*^__^*) 嘻嘻……
腳本如下:(拿走,不謝)
腳本使用M語言寫的,如果想修改添加其他的列,參考一下M語言。 (又一種語言,╮(╯▽╰)╭)
1 (StartDate as date, YearsToAppend as number, FinancialYearStartingMonth as number ) => 2 let 3 4 YearsToAppend = YearsToAppend, 5 FinancialYearStartingMonth= FinancialYearStartingMonth, 6 StartDate = #date(Date.Year(StartDate), Date.Month(StartDate), Date.Day(StartDate)), 7 // Generate base table 8 Source = List.Dates(Date.From(StartDate),YearsToAppend*365,#duration(1, 0, 0, 0)), 9 Transformed = List.Transform(Source, each Date.ToRecord(_)), 10 Tabled = Table.FromList(Transformed,Record.FieldValues,{"Year","Month","Day"}), 11 //Add Full Date Column 12 DateBKey = Table.AddColumn(Tabled,"DateBKey",each Date.FromText(Text.From([Year])&"-"&Text.From([Month])&"-"&Text.From([Day]))), 13 DateKeyAdded = Table.AddColumn(DateBKey,"DateKey",each ([Year] * 10000) + ([Month] * 100) + [Day]), 14 FullDateNameAdded = Table.AddColumn(DateKeyAdded,"DateFullName",each DateTime.ToText(DateTime.From([DateBKey]),"dd MMMM yyyy")), 15 // Calendar Quarter 季度 16 CalendarQuarterAdded = Table.AddColumn(FullDateNameAdded, "Calendar Quarter", 17 each Number.IntegerDivide(Date.Month([DateBKey])-1,3) + 1 18 ), 19 // Calendar Month Number 年月 20 CalendarMonthNumberAdded = Table.AddColumn(CalendarQuarterAdded, "Calendar Month Number", 21 each Date.Year([DateBKey]) * 100 + Date.Month([DateBKey]) 22 ), 23 // Is Week Day 工作日 or 周末 24 WeekDayAdded = Table.AddColumn(CalendarMonthNumberAdded, "IsWeekDay", 25 each 26 if 27 Date.DayOfWeek(DateTime.From([DateBKey]))=Day.Sunday 28 or 29 Date.DayOfWeek(DateTime.From([DateBKey]))=Day.Saturday 30 then 0 else 1 ), 31 // Day Of Week 32 DayOfWeek = Table.AddColumn(WeekDayAdded,"DayOfWeek",each Date.DayOfWeek(DateTime.From([DateBKey]))), 33 // Month Name 34 MonthName = Table.AddColumn(DayOfWeek,"Month Name",each DateTime.ToText(DateTime.From([DateBKey]),"MMMM")), 35 // Day of Week Name 36 DayOfWeekName = Table.AddColumn(MonthName,"Day of Week Name",each DateTime.ToText(DateTime.From([DateBKey]),"dddd")), 37 38 // Fiscal Year 財年 39 FiscalYearAdded = Table.AddColumn(DayOfWeekName, 40 "Fiscal Year", 41 each 42 if Date.Month([DateBKey]) >= FinancialYearStartingMonth then 43 Date.Year([DateBKey]) + 1 44 else 45 Date.Year([DateBKey]) 46 ), 47 // Fiscal Month 財年月份 48 FiscalQuarterAdded = Table.AddColumn(FiscalYearAdded, 49 "Fiscal Quarter", 50 each 51 if Date.Month([DateBKey])>=FinancialYearStartingMonth then 52 Number.IntegerDivide((Date.Month([DateBKey])-FinancialYearStartingMonth),3) + 1 53 else 54 Number.IntegerDivide((12 + Date.Month([DateBKey])-FinancialYearStartingMonth),3) + 1 55 ) 56 in 57 FiscalQuarterAdded