1. はじめに
Pythonで日付や時刻を扱う際に便利なのが、ISO8601形式の文字列とdatetimeオブジェクトの相互変換です。ISO8601形式とは、「2025-07-25T14:30:00
」のように日付と時刻を統一フォーマットで表現する方法で、Web APIやデータのやり取りで広く使われています。
本記事では、Python|ISO8601形式の文字列とdatetimeオブジェクトを相互変換する方法について、初心者でも理解できるよう丁寧に解説していきます。具体的なコード例や実行結果を交えながら、実務や学習にも役立つ知識を身につけましょう。
2. PythonにおけるISO8601形式とdatetimeの基本
ISO8601とは?
ISO8601形式は、国際標準化機構(ISO)が定めた日付と時刻の表記形式です。Pythonのdatetimeモジュールは、この形式の文字列を簡単に扱うことができます。
datetimeオブジェクトをISO8601形式に変換
datetimeオブジェクトをISO8601形式の文字列に変換するには、isoformat()
メソッドを使います。
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
# ISO8601形式の文字列に変換
iso_string = now.isoformat()
print(iso_string)
実行結果:
2025-07-25T20:15:30.123456
ISO8601形式の文字列をdatetimeオブジェクトに変換
文字列からdatetimeオブジェクトに変換するには、fromisoformat()
を使います(Python 3.7以降)。
from datetime import datetime
# ISO8601形式の文字列
iso_string = "2025-07-25T20:15:30"
# datetimeオブジェクトに変換
dt = datetime.fromisoformat(iso_string)
print(dt)
実行結果:
2025-07-25 20:15:30
3. よくある使い方・応用例
Web APIとの連携でISO8601形式を使う
多くのREST APIでは、リクエストやレスポンスにISO8601形式の日付が使われています。たとえば、APIで取得したデータをdatetimeに変換して処理するときに便利です。
import json
from datetime import datetime
# APIレスポンス例(JSON文字列)
response = '{"timestamp": "2025-07-25T14:30:00"}'
# パースしてISO8601文字列を取り出す
data = json.loads(response)
iso_str = data["timestamp"]
# datetimeに変換
dt = datetime.fromisoformat(iso_str)
# 曜日を取得
weekday = dt.strftime("%A")
print(f"{dt} は {weekday} です。")
実行結果:
2025-07-25 14:30:00 は Friday です。
タイムゾーン付きのISO8601形式に対応する
タイムゾーン情報を含むISO8601形式(例:2025-07-25T14:30:00+09:00
)を扱う場合は、dateutil
ライブラリのparser.parse
を使うのが便利です。
from dateutil import parser
# タイムゾーン付きのISO8601形式
iso_str_tz = "2025-07-25T14:30:00+09:00"
# datetimeに変換
dt = parser.parse(iso_str_tz)
print(dt)
実行結果:
2025-07-25 14:30:00+09:00
4. 注意点・エラー対策
Pythonバージョンによる対応の違い
datetime.fromisoformat()
はPython 3.7以降で利用可能です。古いバージョンではstrptime()
を使って手動でパースする必要があります。
from datetime import datetime
# 古いPythonバージョン用
iso_string = "2025-07-25T20:15:30"
dt = datetime.strptime(iso_string, "%Y-%m-%dT%H:%M:%S")
print(dt)
実行結果:
2025-07-25 20:15:30
タイムゾーンの扱いに注意
fromisoformat()
はタイムゾーンのあるISO8601文字列を完全にはサポートしていません。タイムゾーン付きの場合はdateutil.parser.parse()
を使いましょう。
マイクロ秒の扱い
ISO8601形式にはマイクロ秒(例:.123456
)が含まれることがあります。fromisoformat()
はマイクロ秒も正しく処理しますが、精度が不要な場合は無視しても構いません。
5. まとめ
本記事では、PythonでISO8601形式の文字列とdatetimeオブジェクトを相互変換する方法について学びました。基本のisoformat()
とfromisoformat()
に加え、dateutil
ライブラリを活用することで、タイムゾーンや細かな仕様にも対応できるようになります。
この知識は、API連携・ログ解析・データの整形など、実務に直結する場面で非常に役立ちます。Pythonで日付や時刻を自在に扱えるようになることは、データ処理の幅を大きく広げる第一歩です。ぜひ自分のプロジェクトでも活用してみてください!