PYTHON MEBY

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`オブジェクトを直接渡すとエラーが発生します。

  • タイムゾーンを常に明示的に指定する
  • マイクロ秒の精度を必要に応じて制御する
  • オブジェクトの型を事前に確認する

関連記事