Python Excel操作 逆引き集 | 日付列を自動でパースする

Python
スポンサーリンク

Pythonで日付列を自動パースする入門 — parse_dates=[‘date_col’]

日時の計算や集計を楽にするコツは、読み込み時に日付を「文字列のまま」ではなく datetime 型へ変換しておくこと。pandas.read_excelparse_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_datetimeerrors="coerce" と推定オプションが有効。
  • 集計・抽出は .dt アクセサ を使うとシンプル。

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