1. 程式人生 > >Power BI 關於日期顯示格式的那些事兒

Power BI 關於日期顯示格式的那些事兒

由於不同國家地區風俗不同,導致使用的日期格式不一樣,例如天朝和很多亞洲國家,使用的是年月日格式(YYYMMDD),即2018/01/12,代表2018年1月12日;大部分歐洲國家以及其之前的殖民地使用的是日月年格式(DDMMYYYY),例如英國,法國,澳大利亞,紐西蘭等,在這種格式下01/12/2018代表2018年12月1日。還有少部分追隨美國的非主流國家使用了月日年格式(MMDDYYYY),而在這些國家中01/12/2018代表2018年1月12日,與日月年格式的意義有很大差別。因此,在Power BI中對資料進行處理時要特別留意資料的日期格式。

如果親要處理的日期資料都是統一的US格式,那恭喜你,基本不需要任何特殊處理,只需要留意一下選項->區域設定中區域匯入設定是否選了英語(美國)就行。這個是一個全域性控制選項,會控制匯入到當前Power BI報表中資料的顯示樣式。選擇美國意味著所有的日期資料都會按照MMDDYYYY的格式進行匯入,並且按照MMDDYYYY的樣式進行顯示。

這裡寫圖片描述

如果處理的資料格式是既有US格式又有UK格式的怎麼辦?即,可能有兩行日期列,一行是MMDDYYYY的格式,另外一行是DDMMYYYY的格式。一般情況下,如果匯入區域選擇的是美國,當匯入這種資料時,Power BI會拼命的按照MMDDYYYY要求對所有日期進行處理,如果它發現有月份數大於12時,就會跑錯,認為當前日期資料有問題。

這裡寫圖片描述

顯然,按照UK日期DDMMYYYY格式解讀的話,Date UK一行表示1月1日,2日,3日和13日,與Date US一列中的日期相同。但是按照US格式解讀,這一行就變成了1月1日,2月1日,3月1日和無法解析的13月1日,明顯資料意義都發生了變化。要解決該問題,需要把UK日期資料轉換成US日期資料。方法是選擇Date UK資料列,然後右鍵,選擇更改型別->使用區域設定。這個地方選擇日期資料型別,然後區域設定選擇英語(英國),目的是告知Power BI當前匯入的資料是原始格式是DDMMYYYY,需要轉譯成選項->區域設定中區域匯入設定是英語(美國)使用的MMDDYYYY的格式。 這裡寫圖片描述

這裡面需要特別注意,更改UK Date區域設定這一步,必須是在原始資料上進行,即Date UK列下沒有任何Error,不能在Date 包含Error的情況下進行,否則Power BI無法正確解析。 這裡寫圖片描述

如果要處理的當前表單所有日期都是UK的,則可以直接更改選項->區域設定中區域匯入設定,換成英語(英國)即可。但是注意,無論是那種區域更改,修改的都是Power BI中日期的顯示樣式,並不會對DAX中的日期函式產生影響。為什麼這麼說呢,可以看下面這個例子。

把Power BI的區域設定改成英語(英國),這樣,當前Power BI檔案中所有顯示的日期都變成了DDMMYYYY格式。 這裡寫圖片描述 如果用DDMMYYYY格式在這個檔案中建立一個1月1日到12月1日的日曆,效果是下面這個樣子。

Calendar = CALENDAR("1/1/2018","1/12/2018")

這裡寫圖片描述 我們期待的是DAX CALENDAR函式會將輸入的1/12/2018解析為2018年12月1日,但實際上DAX函式還是將該日期按照美國MMDDYYYY的格式進行了解讀,變成了2018年1月12日。

那麼DAX函式是否始終如一的對日期資料按照MMDDYYYY格式進行解讀呢,似乎也不是,例如對當前公式進行修改,變為:

Calendar = CALENDAR("1/1/2018","31/12/2018")

此時,生成的日曆變成了從1月1日到12月31日,符合UK格式標準。 這裡寫圖片描述

從這個例子中可以看出,其實DAX中對日期的處理並不是完全固定死按照MMDDYYYY的格式進行了解讀,但是一旦遇到資料可以符合MMDDYYYY的格式要求,就一定會按照MMDDYYYY的格式進行了解讀。因此,為了相容DDMMYYYY資料,防止DAX對日期格式解讀出錯,對於上面公式可以使用DATE函式來輸入日期。因為DATE函式固定了需要以年月日順序輸入日期,因此可以保證解讀日期格式不會出錯。

Calendar = CALENDAR(DATE(2018,1,1),DATE(2018,12,1))

這裡寫圖片描述

DATE函式輸入日期比較適用於需要使用固定日期所謂引數的表示式。如果是需要動態日期,則可以考慮使用MIN和MAX函式。例如,對於DATEDIFF這個函式,如果按照UK DDMMYYYY格式求1月1日到3日一共間隔多少天,當直接輸入日期時,DATEDIFF函式會按照US格式解析,認為求得是1月1日到3月1日的日期間隔,結果是59天。 這裡寫圖片描述

如果用MIN和MAX函式獲取當前表單中的最大日期和最小日期,則DATEDIFF函式就能按照DDMMYYYY格式正確計算出日期間隔。

FixDate = DATEDIFF(MIN(Locale[Date UK]),MAX(Locale[Date UK]),DAY)

這裡寫圖片描述