CSV から読み込んだ日付データが文字列のままになっていて、日時として扱えないという経験は多いはずです。pandas の to_datetime を使えば、さまざまな形式の文字列を datetime64 型に変換できます。
基本的な変換
pd.to_datetime にシリーズや列を渡すだけで、自動的にフォーマットを推定して変換してくれます。
import pandas as pd
df = pd.DataFrame({
"date_str": ["2024-01-15", "2024-02-20", "2024-03-10"]
})
df["date"] = pd.to_datetime(df["date_str"])
print(df.dtypes)
変換後の列は datetime64[ns] 型になり、日付の差分計算や月ごとの集計が可能になります。
フォーマットを明示する
日付の形式が標準的でない場合は、format 引数で書式を指定します。
df = pd.DataFrame({
"date_str": ["15/01/2024", "20/02/2024", "10/03/2024"]
})
df["date"] = pd.to_datetime(df["date_str"], format="%d/%m/%Y")
format を明示すると解析の速度も向上します。データが大量にある場合、自動推定に任せるよりも高速に処理できるため、フォーマットがわかっているなら積極的に指定しましょう。
| %Y | 4 桁の西暦(2024) |
| %m | 2 桁の月(01〜12) |
| %d | 2 桁の日(01〜31) |
| %H | 時(00〜23) |
| %M | 分(00〜59) |
| %S | 秒(00〜59) |
和暦や日本語形式の変換
「2024年1月15日」のような形式も format で対応できます。
s = pd.Series(["2024年1月15日", "2024年2月20日"])
result = pd.to_datetime(s, format="%Y年%m月%d日")
print(result)
変換できない値の処理
データにノイズが混ざっていて変換に失敗する場合は、errors 引数で挙動を制御します。
s = pd.Series(["2024-01-15", "not a date", "2024-03-10"])
result = pd.to_datetime(s, errors="coerce")
print(result)
errors="raise"
変換できない値があるとエラーを発生させる。デフォルトの挙動
errors="coerce"
変換できない値を NaT(Not a Time)に置き換える。欠損として扱える
errors="coerce" で変換すると、不正な値は NaT になります。NaT は日時における NaN のようなもので、isna で検出できます。
read_csv で読み込み時に変換する
CSV の読み込みと同時に日時変換を済ませることもできます。
df = pd.read_csv("sales.csv", parse_dates=["order_date"])
parse_dates に列名のリストを渡すと、指定した列が自動的に datetime64 型に変換されます。後から to_datetime を呼ぶ手間が省けるので、日時列が含まれるファイルを読み込むときはこのオプションを活用するのがおすすめです。