鷹尾祥(アキラ)のExcel BI ブログ

Excelの革新的機能であるパワーピボット/パワークエリ/DAXについて紹介します。

PowerQuery 日付型データ② (計算)

今回はパワークエリのデータ型のうち、日付型データの計算を扱います。
以下、前回の記事のサンプルデータを使用します。

modernexcel7.hatenablog.com

ポイントとしては、日付・時刻の加減算には期間(Duration)型を使用する点です。
また、2点の日付・時間と差も同様に期間(Duration)型として計算されます。

日付の加算

X日後の日付(データ型のエラー)

まずはカスタム列で以下の式を追加します。

サンプル式: [日付] + 1

f:id:modernexcel7:20191103135550p:plain

すると結果はErrorとなります。

f:id:modernexcel7:20191103135617p:plain

Errorをクリックしてエラーの中身を確認します。

f:id:modernexcel7:20191103135649p:plain

メッセージを見ると、どうやらDate型とNumber型では +(足し算)を行えないようです。

X日後の日付(#durationの使用)

今度はPowerQuery 日付型データ① (基本) - Akira Takao’s blogに登場した期間型のデータを使用します。

期間型の書式: #duration(日数, 時間, 分, 秒)

サンプル式:  [日付] + #duration(1, 0, 0, 0)

f:id:modernexcel7:20191103140328p:plain

すると無事、1日後の日付となりました。

f:id:modernexcel7:20191103140458p:plain


ちなみに負の数:ー1を入力すると、1日前の日付となります。

サンプル式:  [日付] + #duration(-1, 0, 0, 0)

f:id:modernexcel7:20191103144129p:plain

X日後の日付(他列との連携)

今度は他列の値を日付に反映させます。まずMS社のガイドで#durationを検索して仕様を確認します。

#duration - PowerQuery M | Microsoft Docs

#duration(days as number, hours as number, minutes as number, seconds as number) as duration

ここを見ると、それぞれのパラメータは数字型が使えますので、Number列を当てはめてみます。

サンプル式:  [日付] + #duration([Number], 0, 0, 0)

f:id:modernexcel7:20191103141247p:plain

それぞれNumberの値の分だけ加算された日付が表示されました。

f:id:modernexcel7:20191103141518p:plain


さらに次は日付/時刻型期間型の列を加算します。

サンプル式:  [#"日付/時刻"] + [期間]

※ 今回は期間の時刻部分の加算も確認するため、日付列ではなく日付/時刻列を使用しています。

f:id:modernexcel7:20191103141940p:plain

日、時、分、秒が加算されました。

f:id:modernexcel7:20191103142050p:plain

X日後の日付(関数を使用した例)

最後は関数を使用したパターンです。今回もまずMS社のガイドでDateを検索すると、Date.AddDaysという関数が見つかります。

#duration - PowerQuery M | Microsoft Docs

Date.AddDays(dateTime as any, numberOfDays as number) as any

この使用を参考にカスタム列の数式を以下のように変更します。

サンプル式: Date.AddDays([日付],1)

f:id:modernexcel7:20191103142938p:plain

すると無事1日あとの日付にすることができました。

f:id:modernexcel7:20191103143220p:plain


NumberOfDaysの値をNumber列に差し替えても同様に上手くいきます。

サンプル式: Date.AddDays([日付],[Number])

f:id:modernexcel7:20191103143401p:plain


ただし、関数の仕様を確認すると、戻り値の方がAny(すべて)型になっているので、このまま閉じて読み込むを実行すると日付の書式になりません。

Date.AddDays(dateTime as any, numberOfDays as number) as any

f:id:modernexcel7:20191103143549p:plain

データ型を日付型に変換して、再度閉じて読み込むを実行してください。

f:id:modernexcel7:20191103143641p:plain

f:id:modernexcel7:20191103143740p:plain

日付の差分

最後に日付の差分を求めます。新しいカスタム列を作成して、以下の数式を入力してください。

サンプル式: [日付の加算] - [日付]

f:id:modernexcel7:20191103195120p:plain

すると、結果が期間型の形式で表示されます。

f:id:modernexcel7:20191103195921p:plain

期間型のデータでは扱いにくいので、カスタム列の式を以下のように変えて日数に変換します。

サンプル式: Duration.Days([日付の加算] - [日付])

これで日数のデータになりました。

f:id:modernexcel7:20191103195511p:plain