スポンサーリンク

【PowerQuery】関数だと簡単にできるのにパワークエリではどうやるんだ?を集めた②日付編

パワークエリ
スポンサーリンク
※当サイトは広告を含みます

1.はじめに

パワークエリ1年生の苦悩シリーズ。

エクセル関数だとチャッとできるのに、パワークエリだとどうやるんだ?の、(自分が)よく使うものを集めましたシリーズ2回目。悲しいくらいに忘れるので、毎回どうやるんだっけ?→調べる、と時間がかかるので、ここに書いておく。

なお、クリック操作でやる方法ではなく、関数を書くほうが好みなので関数でやる方法を主に書いています。

ちなみになぜ関数で書くほうを好むかというと
・関数を知っていると、クリック操作でやるよりステップ数を短くできる場合がある
・関数を知っていると、複雑な要求もパワークエリ内で処理できる場合がある
・クリック操作でやるよりなんかデキル人っぽい感じがする
ような気がする、からです。

今回は日付関連を中心にやっています。
Date関数
DateTime 関数

2.日付関連のエクセル関数をM関数でやると

(1)今現在(年月日時分秒)

エクセル関数だと(あんまり使わないけど)
=NOW()
→ 2024/4/7 13:36:14

パワークエリだと
=DateTime.LocalNow()
→ 2024/4/7 13:36:14

DateTime.LocalNow

(2)今日(日付)

エクセル関数だと
=TODAY()
→ 2024/4/7

パワークエリだと、「今現在」をだして、そこから日付を抽出する
=Date.From(DateTime.LocalNow())
→ 2024/4/7

または

= DateTime.Date(DateTime.LocalNow())
→ 2024/4/7

Date.From
DateTime.Date

(3)昨日(一日前の日付)

エクセル関数だと、日付は普通に引き算できます。
=Today() – 1
→2024/4/6

パワークエリだと、日付型と数値型の計算がエラーになるので以下のようにやるといいようです。
= Date.From(DateTime.LocalNow()) – #duration(1,0,0,0)

(4)翌日(一日後)

パワークエリだと
= Date.From(DateTime.LocalNow()) + #duration(1,0,0,0)

(5)期間型ってなんだ?

一日前などを算出するのに使用した duration 。

#duration は「期間」
エクセル使いにはなじみのない概念。。。日、時間、分、秒で日付(時間含む)間隔をあらわす単位。。。?
で、1日分(の間隔)をあらわすには #duration(1,0,0,0)
1時間30分(の間隔)をあらわすには #duration(0,1,30,0)

#duration

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

日、時間、分、(小数) 秒を表す数値から期間値を作成します。

引用元:https://learn.microsoft.com/ja-jp/powerquery-m/sharpduration

期間とは?

期間型
時間の長さを表します。モデルに読み込まれる際に 10 進数型に変換されます。 10 進数型であれば、日付/時刻フィールドと加算または減算を行ったとき、正しい結果が得られます。 10 進数型であるため、視覚化のときに大きさを示すために使用しやすくなります。

引用元:https://learn.microsoft.com/ja-jp/power-query/data-types

「日付」列 2024/4/7 0:00:00
一日前:[日付] – #duration(1,0,0,0)
一日後:[日付] + #duration(1,0,0,0)
1時間30分後:[日付] + #duration(0,1,30,0)
90分後:[日付] + #duration(0,0,90,0)
分に90を突っ込むと、自動で繰り上げして1時間30分後を出してくれた。

鷹尾先生の記事で勉強させていただきました。
PowerQuery 日付型データ② (計算)

(6)月末を出す

エクセル関数だと(今日が2024/4/7の場合)
当月末:EOMONTH(TODAY(),0) → 2024/4/30
先月末:EOMONTH(TODAY(),-1) → 2024/3/31
翌月末:EOMONTH(TODAY(),1) → 2024/5/31
とか

パワークエリだと(今日が2024/4/7の場合)
当月末
Date.EndOfMonth(Date.From(DateTime.LocalNow()))
→2024/4/30
先月末
Date.EndOfMonth(Date.AddMonths(Date.From(DateTime.LocalNow()),-1))
→2024/3/31
翌月末
Date.EndOfMonth(Date.AddMonths(Date.From(DateTime.LocalNow()),1))
→2024/5/31

ちなみに Date.AddMonths の場所を間違えるとおかしくなる場合がありますのでご注意。
Date.AddMonths(Date.EndOfMonth(Date.From(DateTime.LocalNow())),1)
→2024/05/30

Date.EndOfMonth
Date.AddMonths

(7)月初の日付

エクセル関数だと(今日の日付が2024/4/7の場合)
当月1日DATE(YEAR(TODAY()),MONTH(TODYA()),1) → 2024/4/1
先月1日:DATE(YEAR(TODAY()),MONTH(TODYA())-1,1) → 2024/4/1
翌月1日:DATE(YEAR(TODAY()),MONTH(TODYA())+1,1) → 2024/4/1
とか。EOMONTHを使ったり、日付で計算したり、他にも方法がいろいろありますが。

パワークエリだと
当月1日
Date.StartOfMonth(Date.From(DateTime.LocalNow()))
→2024/4/1
先月1日
Date.StartOfMonth(Date.AddMonths(Date.From(DateTime.LocalNow()),-1))
→2024/3/1
翌月1日
Date.StartOfMonth(Date.AddMonths(Date.From(DateTime.LocalNow()),1))
→2024/5/1

やはりほかにもいろいろ方法はあるようですが、これが簡単そう。

ちなみに、日付時刻型のままEndOfMonthをやったらおかしなことになったので(繰り上がった?)、元の値が日付型でやるか、Date.Fromなどで日付型に変換してからやったほうが無難そう。
ちなみに下図の結果も「月末」列を日付型に変換すると、4/30になりました。よくわからん。

Date.StartOfMonth

(8)年月日を取り出し

エクセル関数だと(2024/4/7の場合)
年:YEAR(TODAY()) → 2024
月:MONTH(TODAY()) → 4
日:DAY(TODAY()) → 7

パワークエリだと(2024/4/7の場合)
年:Date.Year(DateTime.LocalNow()) → 2024
月:Date.Month(DateTime.LocalNow()) → 4
日:Date.Day(DateTime.LocalNow()) → 7

Date.Year
Date.Month
Date.Day
数値が返されます。

(9)日付をyyyymmddのような文字列または数値に

2024/4/7 を 20240407 のような数値にする場合

エクセル関数だと
文字列にする場合:TEXT(Today(),”yyyymmdd”)
数値にする場合:VALUE(TEXT(Today(),”yyyymmdd”))
他にも方法はありますが、これが簡単かなと思いましたので。

パワークエリだと
文字列にする場合
= Date.ToText(Date.From(DateTime.LocalNow()),”yyyyMMdd”)
数値にする場合
= Number.From(Date.ToText(Date.From(DateTime.LocalNow()),”yyyyMMdd”))
ほかにも方法はあるだろうけど。これが単純かも。
yyyyMMdd の月の MM が大文字になるので注意。

Date.ToText
Number.From
Number.FromText

(10)yyyymmddのような文字列日付を日付型に変換

エクセル関数だと(セルA1に文字列の”20240407″が入っているとする)
DATE(LEFT(A1,4),MID(A1,5,2),RIGHT(A1,2))

2024.5.4.追記
目からうろこのやり方をX(旧ツイッター)で見かけたので追加
セルA1に文字列の”20240407″が入っているとする
=TEXT(A1,”0000-00-00″)*1
これで 20240407 が 2024/4/7 のシリアル値に変換されるんですよ~。
びっくり

パワークエリだと
Date.From(“20240407”)
→2024/4/7

Date.From

(11)年月日の数値を日付に

エクセル関数だと
DATE(年の数値,月の数値,日の数値)
例:DATE(2024,4,7) → 2024/4/7

パワークエリだと
#date(年の数値,月の数値,日の数値)
例:#date(2024,4,7) → 2024/4/7

列の指定も可

注意すべきはエクセル関数の場合、DATE(“2024″,”04″,”07”) のように引数が文字列でもエラーにならない。

パワークエリだと #date 関数の引数は文字列ではだめなので、引数に取る列が文字列型の場合は、数値型に変換してから #date 関数に入れることが必要。

#date

3.最後に

自分用の覚書ですが、エクセル関数使いの方が「パワークエリだとどうやるんだっけ?」となったときにお役に立てば幸いです。

お読みいただきありがとうございました。

4.参考文献、記事

Microsoft Learn より

Date関数
DateTime 関数

Microsoft learn PowerQuery 文字列関数
Microsoft learn PowerQuery 型変換

DateTime.LocalNow
Date.From
DateTime.Date
#duration
Date.EndOfMonth
Date.StartOfMonth
Date.AddMonths
Date.ToText
Number.From
Number.FromText
#date

参考記事 ありがとうございました

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

パワークエリはこの書籍で勉強しました。お勧めです。

コメント

タイトルとURLをコピーしました