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

来源:http://www.cnblogs.com/lizardbi/archive/2017/07/21/DAX-PATTERN-POWERBI-How-to-generate-date-dimension.html
-Advertisement-
Play Games

關於時間序列的計算是一個很(也)常(很)用(大)的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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、連字元字元串轉駝峰——方法1 var a = "first-second-third"; function test(str){ var arr = str.split('-'); for (var i = 1; i < arr.length; i++){ arr[i] = arr[i].cha ...
  • 一,base.css基礎樣式表的意義 我昨天,整理了一下代碼規範。 發現現在這個程度的頁面還原。有必要創建一個規範的base.css庫和framework.css庫 而且也要為日後的工作整理一些常用的基礎css,你們想象一下日後在公司里上班,如果每次都要逐一新增基礎樣式,那麼花費的時間就會滴水長流。 ...
  • 什麼是DOM? HTMLDOM將HTML文檔視作樹結構,被稱為"節點樹" 作用:可通過 JavaScript (以及其他編程語言)對 HTML DOM 進行訪問 ———————————————————————————————————————————— DOM對象方法 具體方法見手冊 getEleme ...
  • 我網上查了很多方法,說是用戶名或者密碼錯誤,但是我通過命令行和Navicat都能直接連接MySQL,但是通過nodejs就是連接不上,命令行中報了標題的那個錯誤,我也問了很多人,也都不是很清楚。 後來我想其他方法都能連接成功,僅僅是nodejs連接不上,是不是nodejs連接還需額外的配置,看了no ...
  • 本文章由尚學堂旗下雲數學院周老師做內容指導,薛同學編輯,如需轉載,請標明出處。 QQ技術交流群:299142667 前言 使用man grep查看grep的幫助文檔,有如下內容: 可以看出,正則表達式由三類,分別是 基本的正則表達式(Basic Regular Expression 又叫 Basic ...
  • 生成AWR報告需要dbms_workload_repository包的許可權。一、以oracle用戶登錄到資料庫伺服器二、進入SQLPLUS三、執行腳本@?/rdbms/admin/awrrpt.sql四、設定生成報告的格式說明:不用輸入,預設即可,直接按Enter五、設定報告時間段的天數說明:只導當... ...
  • 因本人較懶,有些圖片缺失和東西寫的比較簡單,請多包涵 編碼規範: 命名的規範(入鄉隨俗) 編碼習慣: 團隊合作: 團隊配置管理軟體: (TFS SVN) 第一章 更改身份驗證模式:伺服器 屬性 安全性 Master: 記錄所有系統信息 Model: 模板 Msdb: 自動備份 Tempdb: 臨時資 ...
  • 昨晚添加完索引之後, 查詢整表的時候拋出Lock wait timeout exceeded; try restarting transaction, 嚇死小白的我, 為什麼條件查詢可以, 整表查不了, 老大說是不是我添加錯了..., 後來找到解決辦法, 原來是死鎖了查看資料庫的隔離級別select... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...