Power Query | パラメーター設定を利用した指定期間のカレンダー作成(Power BI)

Power BIで日付をもとにカレンダーを作成したい場面で、指定した期間のカレンダーを自動生成する方法を説明します。

技術公開日 読了目安 2 分

Power BIを使っていると、日付をもとにカレンダーを作成したい場面があります。今回は、指定した期間のカレンダーを自動生成する方法について説明します。これはなかなか便利に使えます。

補足:
DAXを使ってカレンダーを作成すると列の追加などで柔軟性が高くなることが分かりました。この記事は、クエリでパラメーターを利用する手順のリファレンスとして書いています。

カレンダー生成のワークフロー

手順は以下のワークフローとなります。

① パラメーター設定(複数モードを考慮)
 ↓
② モードに応じた日付の取得
 ↓
③ カレンダーの作成

パラメーター設定

今回設定するパラメーターは以下の通りです。

image

単純に日付範囲を指定するだけですが、利用者の便宜を考えて複数パターンに対応できるようモード選択機能を追加しています。

① 日付指定モード

指定した開始日・終了日でカレンダーを作成するモードです。

▼ パラメーター設定(前提条件)
A_DATE_MODE = 0

▼ パラメーター設定(設定が必要な項目)
B_START_DATE = 任意のYYYYMMDD [例.20200101]
C_END_DATE = 任意のYYYYMMDD [例.20200131]

② 何日前モード

本日の日付を基準として、指定した日数だけ遡ったところからカレンダーを作成するモードです。

▼ パラメーター設定(前提条件)
A_DATE_MODE = 1

▼ パラメーター設定(設定が必要な項目)
D_DAYS_AGO = 本日から何日遡るか [例.-5(5日前)]
E_DAYS_LATER = 本日から何日進めるか [例.2(2日後)]

モードに応じた日付の取得

前述のモードに応じて日付を算出するため、以下のような処理を行います。START_DATEとEND_DATEは、後述のCalendarクエリのために準備します。

image

▼ クエリ:START_DATE

let
    // For A_date_mode = 0 (Date Specified)
    start_date_0 = Date.FromText(Text.Start(B_START_DATE,4) & "," & Text.Middle(B_START_DATE,4,2) & "," & Text.End(B_START_DATE,2)),

    // For A_date_mode = 1 (Days Ago)
    now_1 = DateTime.LocalNow() ,
    start_date_1 = DateTime.Date(Date.AddDays(now_1,D_DAYS_AGO)),

    // For A_date_mode = 2 (Months Ago)
    now_2 = DateTime.LocalNow() ,
    start_month_2 = DateTime.Date(Date.AddMonths(now_2,F_MONTHS_AGO)),
    start_date_2 = DateTime.Date(Date.AddDays(start_month_2,-Date.Day(start_month_2)+1)),

    // Fetching date based on mode
    start_date_ori = if A_DATE_MODE = 0 then start_date_0 else (if A_DATE_MODE = 1 then start_date_1 else start_date_2)

in
    start_date_ori

▼ クエリ:END_DATE

let
    // For A_date_mode = 0 (Date Specified)
    end_date_0 = Date.FromText(Text.Start(C_END_DATE,4) & "," & Text.Middle(C_END_DATE,4,2) & "," & Text.End(C_END_DATE,2)),

    // For A_date_mode = 1 (Days Ago)
    now_1 = DateTime.LocalNow() ,
    end_date_1 = DateTime.Date(Date.AddDays(now_1,E_DAYS_LATER)),

    // For A_date_mode = 2 (Months Ago)
    now_2 = DateTime.LocalNow() ,
    end_date_2 = DateTime.Date(Date.AddDays(now_2,E_DAYS_LATER)),

    // Fetching date based on mode
    end_date_ori = if A_DATE_MODE = 0 then end_date_0 else (if A_DATE_MODE = 1 then end_date_1 else end_date_2)

in
    end_date_ori

空のクエリを作成し、Advanced Editorに上記のコードを貼り付けることで利用できます。

カレンダーの作成

パラメーターで設定したモードに応じて、指定した期間のカレンダーを作成します。

▼ クエリ:Calendar

let
    Source = List.Generate(
                    ()=>[Date=START_DATE, DayOfWeek=Date.DayOfWeekName(Date)],
                    each [Date]<=END_DATE,
                    each [Date=Date.AddDays([Date],1),DayOfWeek=Date.DayOfWeekName(Date)]
             ),
    Custom = Table.FromRecords(Source),
    AddedCustom = Table.AddColumn(Custom, "YearMonth", each Number.ToText(Date.Year([Date])) & Text.PadStart(Number.ToText(Date.Month([Date])),2,"0")),
    InsertedMonthWeek = Table.AddColumn(AddedCustom, "MonthWeek", each Date.WeekOfMonth([Date]), Int64.Type)
in
    InsertedMonthWeek

このクエリの結果は以下のようになります。

image

以上で、指定した期間のカレンダーを生成する手順は完了です。

以上です。