Pythonで日付列を自動パースする入門 — parse_dates=[‘date_col’]
日時の計算や集計を楽にするコツは、読み込み時に日付を「文字列のまま」ではなく datetime 型へ変換しておくこと。pandas.read_excel の parse_dates を使えば、面倒な後処理が減ります。初心者向けに、すぐ動くコード・テンプレート・つまずき対策をまとめました。
基本の使い方
import pandas as pd
# Date 列を datetime64[ns] に自動変換
df = pd.read_excel("sales.xlsx", parse_dates=["Date"])
print(df.dtypes) # Date が datetime 型になっているか確認
print(df.head())
Python- 効果: 読み込み直後から月や日での集計・フィルタが簡単にできます。
- 確認:
df.dtypesで型を必ずチェック。文字列のまま残っている場合は後述の対策へ。
よく使うオプションと併用例
import pandas as pd
# 英式の日付(DD/MM/YYYY)に対応
df = pd.read_excel("report_uk.xlsx", parse_dates=["Date"], dayfirst=True)
# 型の組み合わせ(コードは文字列、数量は整数、日付はパース)
df = pd.read_excel(
"orders.xlsx",
dtype={"OrderID": "string", "Qty": "Int64"},
parse_dates=["OrderDate"]
)
Python- dayfirst: 日が先のフォーマットに強制。混在時は後処理を併用。
- dtype との併用: コード類は
"string"、数量は"Int64"、日付はparse_datesで安定。
複数列や複合日時のパース
複数の日付列をまとめてパース
df = pd.read_excel("project.xlsx", parse_dates=["StartDate", "EndDate"])
Python年・月・日が別列 → 1つの日時列に統合
import pandas as pd
# 年・月・日で分かれている
df = pd.read_excel("calendar.xlsx", usecols=["year", "month", "day"])
# まとめて datetime に(読み込み後)
df["date"] = pd.to_datetime(df[["year", "month", "day"]])
Python- ポイント: Excel側が分割されている場合は、読み込み後に
pd.to_datetimeで統合するのが簡単。
読み込み後に補正するテクニック(混在・不正値対策)
import pandas as pd
df = pd.read_excel("messy_dates.xlsx", parse_dates=["Date"])
# 文字列が混ざってパースしきれない場合の再変換
df["Date"] = pd.to_datetime(df["Date"], errors="coerce", infer_datetime_format=True)
# 欠損を確認(パースできなかった行)
bad_rows = df["Date"].isna()
print("Unparsed rows:", bad_rows.sum())
print(df.loc[bad_rows].head())
Python- errors=”coerce”: 解釈できない日時は NaN に。後で除外・補完が可能。
- infer_datetime_format: フォーマット推定で成功率を上げる。
すぐ使える集計・加工テンプレート
月次集計
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["Date"])
monthly = (
df.assign(month=df["Date"].dt.to_period("M"))
.groupby("month", as_index=False)["Revenue"].sum()
)
print(monthly)
Python年・月・日で列を増やす(特徴量化)
import pandas as pd
df = pd.read_excel("log.xlsx", parse_dates=["Date"])
df["year"] = df["Date"].dt.year
df["month"] = df["Date"].dt.month
df["day"] = df["Date"].dt.day
df["weekday"] = df["Date"].dt.day_name() # 曜日名
Python範囲フィルタ(期間抽出)
import pandas as pd
df = pd.read_excel("events.xlsx", parse_dates=["Date"])
mask = (df["Date"] >= "2025-01-01") & (df["Date"] < "2025-07-01")
filtered = df.loc[mask]
print(filtered.head())
Pythonつまずきやすいポイントと回避策
- 不揃いフォーマットが混在する:
- 対策: 読み込み後に
pd.to_datetime(..., errors="coerce", infer_datetime_format=True)を再適用。必要ならdayfirst=Trueを併用。
- 対策: 読み込み後に
- Excelがシリアル値(数値)で日付を保持している:
- 対策:
parse_datesで大抵は自動変換されます。失敗する場合はpd.to_datetime(df["Date"], unit="d", origin="1899-12-30")を検討。
- 対策:
- タイムゾーンが必要:
- 対策: 読み込み後に
dt.tz_localize("Asia/Tokyo")またはdt.tz_convert("Asia/Tokyo")を使う。Excelは基本タイムゾーン非対応。
- 対策: 読み込み後に
- 文字列として読みたいケースが混在:
- 対策: 特定列のみ
dtype={"Date": "string"}とし、別列としてparsed_date = pd.to_datetime(...)を作って比較検証。
- 対策: 特定列のみ
ミニ例題(練習用)
- 例題1: 日付列をパースして先頭10行を確認
import pandas as pd
df = pd.read_excel("sales.xlsx", parse_dates=["Date"])
print(df.head(10))
Python- 例題2: DD/MM/YYYY を正しく解釈して月次合計
import pandas as pd
df = pd.read_excel("uk_sales.xlsx", parse_dates=["Date"], dayfirst=True)
monthly = df.assign(m=df["Date"].dt.to_period("M")).groupby("m", as_index=False)["Revenue"].sum()
print(monthly)
Python- 例題3: 混在フォーマットの後処理
import pandas as pd
df = pd.read_excel("messy.xlsx", parse_dates=["Date"])
df["Date"] = pd.to_datetime(df["Date"], errors="coerce", infer_datetime_format=True)
print("Unparsed:", df["Date"].isna().sum())
Pythonまとめ
- 読み込み時に日時へ変換 →
parse_dates=[...]が最短ルート。 - 混在対策は後処理で
pd.to_datetime。errors="coerce"と推定オプションが有効。 - 集計・抽出は
.dtアクセサ を使うとシンプル。
