pandas の dt アクセサで年・月・曜日を取り出す

datetime64 型の列を持つ DataFrame では、dt アクセサを使って年・月・日・曜日などの情報を手軽に取り出せます。日時データを分解して集計やフィルタリングに活用する場面で欠かせない機能です。

dt アクセサの基本

文字列に対する str アクセサと同じように、datetime64 型の列には dt アクセサが用意されています。

import pandas as pd

df = pd.DataFrame({
    "timestamp": pd.to_datetime([
        "2024-01-15 09:30:00",
        "2024-03-22 14:15:00",
        "2024-07-08 18:45:00",
        "2024-12-25 00:00:00"
    ])
})

df["year"] = df["timestamp"].dt.year
df["month"] = df["timestamp"].dt.month
df["day"] = df["timestamp"].dt.day
print(df)

year、month、day はそれぞれ整数で返されるため、そのまま groupby の集計キーとして使えます。

時刻の情報を取り出す

日付だけでなく、時・分・秒も同様に取得できます。

df["hour"] = df["timestamp"].dt.hour
df["minute"] = df["timestamp"].dt.minute
df["second"] = df["timestamp"].dt.second

ログデータの分析で「何時台にアクセスが多いか」を調べるときなどに重宝します。

曜日を取得する

曜日の取得には day_of_week(または dayofweek)を使います。月曜日が 0、日曜日が 6 に対応する整数値が返ります。

df["weekday"] = df["timestamp"].dt.day_of_week
df["weekday_name"] = df["timestamp"].dt.day_name()
print(df[["timestamp", "weekday", "weekday_name"]])

day_name() はメソッドなので括弧が必要です。ロケールに応じた曜日名が文字列で返されるため、レポート用途にも便利でしょう。

dt.year年(整数)
dt.month月(1〜12)
dt.day日(1〜31)
dt.hour時(0〜23)
dt.day_of_week曜日(0=月〜6=日)
dt.day_name()曜日名(Monday 等)
dt.quarter四半期(1〜4)
dt.is_month_end月末かどうか(bool)

四半期と週番号

ビジネスでは四半期ごとの集計を求められる場面が多くあります。

df["quarter"] = df["timestamp"].dt.quarter
df["week"] = df["timestamp"].dt.isocalendar().week

quarter は 1〜4 の整数、isocalendar().week は ISO 8601 に基づく週番号を返します。

日付部分だけを取り出す

時刻情報を落として日付だけにしたい場合は dt.date や dt.normalize() が使えます。

df["date_only"] = df["timestamp"].dt.normalize()

normalize() はすべての時刻を 00:00:00 にリセットするメソッドです。dt.date を使うと Python の date オブジェクトが返りますが、normalize() なら datetime64 型のまま扱えるため、pandas の機能をフルに活用できます。

dt アクセサを使いこなせば、日時データの集計・フィルタリング・可視化がスムーズになります。月別売上の集計や曜日ごとのアクセス分析など、実務でよく使うパターンばかりなので、主要なプロパティは覚えておくとよいでしょう。