Python で ISO 8601 形式の文字列を datetime にパースする

ISO 8601 は日時の国際標準フォーマットで、API やデータ交換で広く使われています。Python で ISO 8601 形式の文字列を datetime にパースする方法を解説します。

ISO 8601 とは

ISO 8601 は 2025-01-15T10:30:00+09:00 のような形式で日時を表します。

日付部分2025-01-15(年-月-日)
区切り文字T
時刻部分10:30:00(時:分:秒)
タイムゾーン+09:00 または Z(UTC)

T は日付と時刻の区切りを示し、末尾のタイムゾーン情報で世界中どこでも一意に時刻を特定できます。

fromisoformat() を使う

Python 3.7 以降、datetime.fromisoformat() で ISO 8601 形式を簡単にパースできます。

from datetime import datetime

# 基本形式
s = "2025-01-15T10:30:00"
dt = datetime.fromisoformat(s)
print(dt)  # 2025-01-15 10:30:00

# タイムゾーン付き
s = "2025-01-15T10:30:00+09:00"
dt = datetime.fromisoformat(s)
print(dt)  # 2025-01-15 10:30:00+09:00

strptime() のように書式を指定する必要がなく、コードがシンプルになります。

Z(Zulu タイム)への対応

UTC を表す Z は、Python 3.11 以降で fromisoformat() が直接対応しました。それ以前のバージョンでは置換が必要です。

from datetime import datetime, timezone

s = "2025-01-15T10:30:00Z"

# Python 3.11 以降はそのまま OK
# dt = datetime.fromisoformat(s)

# 3.10 以前は Z を +00:00 に置換
s_replaced = s.replace("Z", "+00:00")
dt = datetime.fromisoformat(s_replaced)
print(dt)  # 2025-01-15 10:30:00+00:00

互換性を考慮するなら、Z の置換処理を入れておくのが安全です。

strptime() でパースする

fromisoformat() が使えない環境や、より細かい制御が必要な場合は strptime() を使います。

from datetime import datetime

# タイムゾーンなし
s = "2025-01-15T10:30:00"
dt = datetime.strptime(s, "%Y-%m-%dT%H:%M:%S")
print(dt)

# タイムゾーンあり(Python 3.2 以降)
s = "2025-01-15T10:30:00+0900"
dt = datetime.strptime(s, "%Y-%m-%dT%H:%M:%S%z")
print(dt)

%z はタイムゾーンオフセットに対応しますが、+09:00 形式ではなく +0900 形式(コロンなし)を期待する点に注意してください。

ミリ秒・マイクロ秒を含む場合

ISO 8601 では小数秒も許容されています。

from datetime import datetime

# マイクロ秒付き
s = "2025-01-15T10:30:00.123456"
dt = datetime.fromisoformat(s)
print(dt)  # 2025-01-15 10:30:00.123456

# ミリ秒(3桁)も OK
s = "2025-01-15T10:30:00.123"
dt = datetime.fromisoformat(s)
print(dt)  # 2025-01-15 10:30:00.123000

fromisoformat() は3桁から6桁までの小数秒を自動で処理してくれます。

datetime から ISO 8601 へ

逆方向の変換は isoformat() メソッドを使います。

from datetime import datetime, timezone

dt = datetime(2025, 1, 15, 10, 30, 0, tzinfo=timezone.utc)
iso_string = dt.isoformat()
print(iso_string)  # 2025-01-15T10:30:00+00:00

API へのリクエストやログ出力で、標準化されたフォーマットが必要なときに活用できます。