【例項】PowerQuery的自定義日曆

weixin_34249678發表於2016-09-25

由於資料分析經驗不足,我對自定義日曆體驗不深,但看到一些大牛對自定義日曆推崇備至,因此照貓畫虎也籌劃自己的自定義日曆。

一、自定義日曆的兩個來源

  • 一個是本地的自定義日曆,比如自建,或直接複製別人做好的日曆。比較推薦此方法。
  • 另一個是用網上現成的日曆,比如這個https://api.datamarket.azure.com/BoyanPenev/DateStream/v1/ 。這個日曆需要Azure賬號,可以免費申請。也很強大,但是速度有點慢。

我個人推薦自己建一個本地日曆,因為這樣使用方便快速。

二、建立本地自定義日曆

我建立了一個自己需要用到的日曆:

 let
    源 = List.Dates(#date(1900,1,1),Duration.Days(Date.From(#date(2020,12,31))-    Date.From(#date(1900,1,1))),#duration(1,0,0,0)),
    轉換為表 = Table.FromList(源, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    重新命名的列 = Table.RenameColumns(轉換為表,{{"Column1", "Date"}}),
    複製的列 = Table.DuplicateColumn(重新命名的列, "Date", "Date - 複製"),
    重新命名的列1 = Table.RenameColumns(複製的列,{{"Date - 複製", "Year"}}),
    更改的型別2 = Table.TransformColumnTypes(重新命名的列1,{{"Date", type date}}),
    獲取年份 = Table.TransformColumns(更改的型別2,{{"Year", Date.Year}}),
    月份 = Table.AddColumn(獲取年份, "Month", each if Date.Month([Date])<10 then "0"&Text.From(Date.Month([Date])) else Date.Month([Date])),
    更改的型別3 = Table.TransformColumnTypes(月份,{{"Month", type text}}),
    獲取日期 = Table.AddColumn(更改的型別3, "Day", each if Date.Day([Date])<10 then "0"&Text.From(Date.Day([Date])) else Date.Day([Date])),
    更改的型別4 = Table.TransformColumnTypes(獲取日期,{{"Day", type text}}),
    中文星期名稱 = Table.AddColumn(更改的型別4, "DayName", each Date.ToText([Date],"dddd")),
    一年中的第幾周 = Table.AddColumn(中文星期名稱, "Week", each Date.WeekOfYear([Date])),
    更改的型別 = Table.TransformColumnTypes(一年中的第幾周,{{"Date", type date}}),
    更改的型別1 = Table.TransformColumnTypes(更改的型別,{{"Date", type date}, {"Month", type text}, {"Day", type text}}),
    獲取星座 = Table.NestedJoin(更改的型別1,{"Month", "Day"},星座,{"月份", "日期"},"NewColumn",JoinKind.LeftOuter),
    星座獲取完畢 = Table.ExpandTableColumn(獲取星座, "NewColumn", {"星座"}, {"星座"})
in
    星座獲取完畢

注意星座是在本地建立了一個日期和星座的對應表,然後引入到PowerQuery,再合併到日曆中。沒需要可以不用管。

三、使用本地日曆

要注意到我自定義的日曆是到2020年。其實我們實際使用的時候,往往用不到將來的日曆。比如我自己就只用到本年的日期。所以我將日曆引入到我的分析模型時,用下面的程式碼對日曆做了篩選:

篩選的行 = Table.SelectRows(更改的型別, each Date.IsInYearToDate([Date])),
篩選的行1 = Table.SelectRows(篩選的行, each [Month] < Number.From(Date.Month(Date.From(DateTimeZone.LocalNow()))))

第一次篩選,只篩選出本年度到今天的日期;第二次篩選,則篩選出本月之前的月份。原因在於:我每月月初需要提交至上月月底的分析報告,所以做了這麼一個篩選。如果有不同需求,可以進行不同篩選,目的是獲取日曆的有效時間範圍即可。

相關文章