今回は「日付コマンドに用意されている処理」について詳しく紹介していこう。第40回の連載では、年、月、日だけを数値として抽出したり、2つの日付の差(減算)を計算したりする方法を紹介した。これらのほかにも「日付」コマンドには多くの処理が用意されている。用途は限定的になるが、念のため、覚えておくとよいだろう。
「日付」コマンドに用意されている処理
これまで数回にわたって紹介してきた「日時データの処理」の補足として、今回は「日付」コマンドに用意されている処理について詳しく紹介していこう。
使い道が見当たらない処理も沢山あるが、こういった処理も用意されていることを知っておけば、いつか役に立つかもしれない。念のため、頭の片隅にでも記憶しておくとよいだろう。
期間/日付のみ/解析で実行できる処理
まずは、「期間」、「日付のみ」、「解析」を選択したときの処理内容について解説していこう。なお、ここでは「列の追加」タブにある「日付」コマンドを例に、それぞれの処理内容を説明していく。
第42回の連載でも紹介したように、「日付」コマンドから「期間」を選択すると、「選択した列」と「今日の日付」の差が自動計算されるようになっている。ここでは「日付」ではなく、「日付/時刻」のデータに対して「日付」→「期間」を実行した例を紹介しておこう。
この場合は「現在の日時」との差が「期間型のデータ」として自動算出される。上図は、2025/3/7の15:30頃に「日付」→「期間」を実行した例だ。各データについて「現在の日時との差」が1秒未満の数値まで算出されていることを確認できるだろう。なお、日時データが現時点より未来になる場合は、マイナスの期間として計算結果が表示される。
次は、「日付」コマンドから「日付のみ」を選択した場合の例だ。この場合は、元データから時刻の部分を削除した「日付型のデータ」が取得される。
「日付」→「解析」は少し特殊な用途に使用する処理で、「テキスト型のデータ」として記録されている文字を「日付データ」に変換してくれる処理となる。このため、「テキスト型」の列を選択しているときのみ使用可能となる。以下に示した図を例に、その挙動をいくつか紹介しておこう。
変換元のテキストデータが「XXXX年XX月XX日」のように記されていた場合は、問題なく日付データに変換される。XXXX年の部分が省略されていた場合は、今年の日付として処理される。ただし、数字が全角で入力されていた場合はエラーになってしまう。
年、月、日を「-」(ハイフン)や「/」(スラッシュ)、「.」(ピリオド)、「半角スペース」で区切っている場合も問題なく日付データに変換できる。ただし、「_」(アンダーバー)で区切っている場合は正しく解析されず、エラーになってしまう。「20250315」のように、区切り文字のない8桁の数字表記もエラーになる。
そのほか、「から」や「start」などの日付に関係ない文字が含まれている場合もエラーになってしまう。
ちなみに、「日付」コマンドを使うのではなく、データ型を「日付」に変更する方法でも似たような結果を得ることができる。この場合は「20250315」などの8桁の数字表記も正しく日付データに変換できる。よって、単にデータ型を変更する処理のほうが使い勝手はよいかもしれない。
年/月で実行できる処理
続いては、「年」や「月」に分類されている処理について解説していこう。今度は、2023年~2025年の日付がランダムに記録されている列を例に、それぞれの処理結果を紹介していこう。
まずは、「年」→「年」を選択した場合の例だ。この場合は、それぞれの日付データから「年」の部分だけが「整数型のデータ」として抽出される。
「月」→「月」や「日」→「日」を選択した同様で、それぞれの「月」や「日」の部分だけが「整数型のデータ」として抽出される。これについては以前の連載でも紹介しているので、特に問題はないだろう。
「年」→「年の開始日」を選択した場合は、その年の「最初の日付」が処理結果として表示される。つまり、各年の01/01の「日付型のデータ」に変換してくれる処理となる。
「年」→「年の最終日」を選択した場合は、その年の「最後の日付」、すなわち各年の12/31の日付データに変換される。
同様に、「月」→「月の開始日」を選択した場合は「各月の1日」の日付データに変換される。「月」→「月の最終日」を選択した場合は「各月の最後の日」の日付データに変換される。以下の図の赤枠で囲んだ箇所を見るとわかるように、この処理は閏年(02/29)にも対応している。
なお、元データが「日付/時刻」のデータ型であった場合は、「各月の最後の日時」に変換される。ただし、この時刻は23:59:59ではない。23:59:59は1日の終了ではなく、まだ1秒だけ残っているので、さらに1秒を加えて「翌月1日の午前0時」という変換結果になる。間違えないように注意しておこう。
続いては、「月」→「月内の日数」を選択した場合の例を紹介する。この場合は、その月の日数が「整数型のデータ」として取得される。以下の図の赤枠で囲んだ箇所を見るとわかるように、こちらも閏年に対応している。
最後に、「月」→「月の名前」を選択した場合の例だ。この場合は「X月」という「テキスト型のデータ」として、それぞれの日付から「月の名前」が取得される。
四半期/週で実行できる処理
続いては、「四半期」に分類される処理を紹介していこう。四半期は、1年を4つに区分した期間となる。具体的には、1~3月が第1四半期、4~6月が第2四半期、7~9月が第3四半期、10~12月が第4四半期となる。
「日付」コマンドから「四半期」→「年の四半期」を選択した場合は、それぞれの日付が属する四半期が「整数型のデータ」として取得される。
「四半期」→「四半期の開始日」を選択した場合は、その日付が属する四半期の「最初の日」が「日付型のデータ」として取得される。つまり、01/01、04/01、07/01、10/01のいずれかの日付に変換されることになる。
逆に、「四半期」→「四半期の最終日」を選択した場合は、その日付が属する四半期の「最後の日」が取得される。その結果、3/31、6/30、9/30、12/31のいずれかの日付に変換されることになる。
次は、「週」に分類される処理を紹介していこう。「週」→「年の通算週」を選択した場合は、その日付が「各年の何週目に属しているか?」を示す数値が「整数型のデータ」として取得される。ちなみに、パワークエリでは「週の始まりは日曜日」と定義されている。
「週」→「月の通算週」を選択した場合は、その日付が「各月の何週目に属しているか?」を示す数値が「整数型のデータ」として取得される。たとえば、2025年1月は1/4(土)までが第1週目で、1/5(日)からは第2週目になる(下図の7~8行目)。同様に、2025年3月は土曜日から始まるので、第1週目は3/1(土)の1日しかなく、3/2(日)は第2週目になる(下図の11~12行目)。
「週」→「週の開始日」を選択した場合は、その週の最初の日、すなわち「同じ週にある日曜日」が「日付型のデータ」として取得される。なお、週が月をまたぐ配置になっていた場合は、「先月の最後の日曜日」が取得されることになる(以下の図の赤枠を参照)。
同様に「週」→「週の最終日」は、その週の最後の日、すなわち「同じ週にある土曜日の日付」を取得する処理となる。
日で実行できる処理
続いては、「日」に分類されている処理を紹介していこう。
「日」→「週の通算日」を選択した場合は、日曜日を起点にして「各週の中で何番目になるか?」が「整数型のデータ」として取得される。なお、各週の先頭(日曜日)は0としてカウントされるため、取得される数値は0~6のいずれかになる。
これらの数値は曜日を示しているとも考えられる。先ほどの例に「日」→「曜日名」の処理を追加した例を紹介しておこう。この場合、元データの日付の「曜日」が「テキスト型のデータ」として取得される。
上図を見ると、「週の通算日」の0は日曜日、1は月曜日、2は火曜日、……、6は土曜日に対応していることを確認できるだろう。
「日」→「年の通算日」を選択した場合は、各年の先頭から数えて「何日目に相当するか?」が「整数型のデータ」として取得される。こちらは、1/1が1日目、1/2が2日目、……となり、1/31は31日目、2/1は32日目、2/2は33日目、……というカウント方法になる。
「日」→「一日の開始時刻」は、日付データではなく、日時データに使用するのが基本で、「その日の最初の時刻」を取得する処理となる。つまり、時刻だけを0:00:00に変更してくれる処理と考えればよい。
その逆の処理に相当するのが「日」→「最終日」だ。「最終日」という表現は少し理解しづらいので、「一日の終了時刻」と考えるとよいだろう。ただし、時刻が23:59:59に変換される訳ではない。これでは、1日の終了までに1秒だけ残ってしまう。よって、「翌日の0:00:00」が処理結果として表示されることになる。
複数の列を対象にした処理
最後に、「複数の列を同時に選択したとき」だけ使用可能になる処理について紹介していこう。
「日数の減算」は、第40回の連載でも紹介したように「2つの日付の差」を自動計算してくれる処理だ。「1番目に選択した列」から「2番目に選択した列」を引き算する計算が行われ、「整数型のデータ」として結果が表示される。以下の図は、「納品日」→「受注日」の順番に列を選択して「日数の減算」を実行した例だ。
「日付と時刻の組み合わせ」は、「日付の列」と「時刻の列」を組み合わせて日時データを作成してくれる処理となる。当然ながら、その処理結果は「日付/時刻型のデータ」になる。
「最も早い」は、それぞれの行で「最も早い日付」を抽出してくれる処理となる。以下の図は、「A社」~「C社」の3列を選択した状態で「最も早い日付」を実行した例だ。つまり、A~C社の中で最も早く荷物が届く日付をピックアップできることになる。
これとは逆に、「最も遅い」は選択した列の中から「最も遅い日付」を抽出する処理となる。
以上が「日付」コマンドに用意されている処理の概要となる。年、月、日を抽出する処理に比べて、他の処理は滅多に使わない処理になるかもしれないが、参考までに覚えておくとよいだろう。