Pythonで日付・時刻をISO 8601形式に変換(isoformat)
この記事では、Pythonで日付と時刻データをISO 8601形式に変換する方法を説明します。datetimeモジュールとisoformat()メソッドの使い方を学びます。様々な状況に対応できるよう、タイムゾーンの扱い方についても解説します。
目次
datetime.datetime.isoformat()メソッドの基本
Pythonの`datetime`モジュールにある`datetime.datetime.isoformat()`メソッドは、日付時刻オブジェクトをISO 8601形式の文字列に変換します。最も基本的な使い方は以下の通りです。
import datetime
datetime_obj = datetime.datetime(2024, 1, 26, 10, 30, 45)
iso_formatted_string = datetime_obj.isoformat()
print(iso_formatted_string) # 出力: 2024-01-26T10:30:45
このメソッドは、`YYYY-MM-DDTHH:MM:SS`形式の文字列を返します。`T`は日付と時刻を区切る文字です。
タイムゾーンの指定
タイムゾーンを明示的に指定するには、`datetime.datetime.isoformat()`メソッドの`timespec`引数と`tzinfo`引数を使用します。`timespec`引数でマイクロ秒レベルまでの精度を指定できます。`tzinfo`引数には、タイムゾーン情報を保持するオブジェクトを渡します。`pytz`モジュールを使うと簡単にタイムゾーンを扱うことができます。
import datetime
import pytz
# タイムゾーン付きのdatetimeオブジェクトを作成
local_tz = pytz.timezone('Asia/Tokyo')
datetime_obj_tz = local_tz.localize(datetime.datetime(2024, 1, 26, 10, 30, 45))
# タイムゾーン付きでISO 8601形式に変換
iso_formatted_string_tz = datetime_obj_tz.isoformat()
print(iso_formatted_string_tz) # 出力: 例: 2024-01-26T10:30:45+09:00
# マイクロ秒を含めて変換
iso_formatted_string_tz_micro = datetime_obj_tz.isoformat('microseconds')
print(iso_formatted_string_tz_micro) #出力: 例: 2024-01-26T10:30:45.000000+09:00
出力されるタイムゾーン表記は、使用している`pytz`のバージョンや設定によって異なる場合があります。
マイクロ秒の精度
`timespec`引数に'microseconds'を指定することで、マイクロ秒の精度を含めたISO 8601形式の文字列を得られます。'seconds'を指定するとマイクロ秒は含まれません。
import datetime
datetime_obj = datetime.datetime(2024, 1, 26, 10, 30, 45, 123456)
# マイクロ秒を含む
iso_formatted_string_micro = datetime_obj.isoformat('microseconds')
print(iso_formatted_string_micro) # 出力: 2024-01-26T10:30:45.123456
# マイクロ秒を含まない
iso_formatted_string_sec = datetime_obj.isoformat('seconds')
print(iso_formatted_string_sec) # 出力: 2024-01-26T10:30:45
デフォルトでは'seconds'が使用されます。
例:様々な日付時刻オブジェクトの変換
`date`オブジェクトや`time`オブジェクトを直接`isoformat()`で変換することはできません。`datetime`オブジェクトに変換してから使用する必要があります。
import datetime
date_obj = datetime.date(2024, 1, 26)
time_obj = datetime.time(10, 30, 45)
# dateオブジェクトとtimeオブジェクトをdatetimeオブジェクトに変換
datetime_obj = datetime.datetime.combine(date_obj, time_obj)
iso_formatted_string = datetime_obj.isoformat()
print(iso_formatted_string) # 出力: 2024-01-26T10:30:45
このように、異なる日付時刻オブジェクトを統一的に処理できます。
よくある間違いと注意点
ISO 8601形式の文字列を扱う際には、タイムゾーンを明確に指定することが重要です。タイムゾーンを省略すると、誤解やバグの原因となる可能性があります。また、`isoformat()`メソッドは、日付時刻オブジェクトが`datetime`オブジェクトであることを確認する必要があります。`date`オブジェクトや`time`オブジェクトを直接渡すとエラーが発生します。
- タイムゾーンを常に明示的に指定する
- マイクロ秒の精度を必要に応じて制御する
- オブジェクトの型を事前に確認する
関連記事
- Pythonで現在の日付・時刻を取得(datetime.datetime.now, datetime.date.today)
- Pythonで特定の日付・時刻を作成(datetime.datetime, datetime.date, datetime.time)
- Pythonで日付・時刻の加算・減算(timedelta)
- Pythonで日付・時刻のフォーマット変換(strftime, strptime)
- PythonでUNIXタイムスタンプと日付・時刻を相互に変換(timestamp, fromtimestamp)
- Pythonで特定の日付や曜日を計算
- Pythonでタイムゾーンを設定(pytz, zoneinfo (Python 3.9以降))