PythonでISO8601形式の日付時刻文字列をdatetimeオブジェクトに変換する方法
Python の datetime
モジュールは、日付と時刻を扱うための強力なツールを提供しています。その中でも、datetime.datetime.fromisoformat()
関数は、ISO 8601 形式の文字列を datetime
オブジェクトに変換するために使用されます。この関数は、日付と時刻を扱うプログラミングにおいて非常に役立ちます。
ISO 8601 形式とは
ISO 8601 形式は、日付と時刻を表現するための国際的な標準規格です。この形式は、世界中で広く使用されており、様々なシステム間でのデータ交換を容易にします。ISO 8601 形式には、以下の種類があります。
- 日付と時刻とタイムゾーン
YYYY-MM-DDTHH:MM:SS[.mmm]±HH:MM (例: 2024-05-26T17:58:00.000+07:00) - 日付と時刻
YYYY-MM-DDTHH:MM:SS[.mmm] (例: 2024-05-26T17:58:00.000) - 日付のみ
YYYY-MM-DD (例: 2024-05-26)
datetime.datetime.fromisoformat() 関数の使い方
datetime.datetime.fromisoformat()
関数は、以下の引数を受け取ります。
- iso_format
ISO 8601 形式の文字列
この関数は、datetime
オブジェクトを返します。
例
from datetime import datetime
# ISO 8601 形式の文字列
iso_format = "2024-05-26T17:58:00.000"
# datetime オブジェクトに変換
dt = datetime.datetime.fromisoformat(iso_format)
# 日付と時刻を出力
print(dt.date()) # 2024-05-26
print(dt.time()) # 17:58:00.000
datetime.datetime.fromisoformat() 関数の注意点
- この関数は、Python 3.7 以降でのみ使用できます。
iso_format
引数は、有効な ISO 8601 形式の文字列である必要があります。
datetime.datetime.fromisoformat()
関数は、ISO 8601 形式の文字列を datetime
オブジェクトに変換するための便利なツールです。この関数は、日付と時刻を扱うプログラミングにおいて、様々な場面で役立ちます。
- この解説は、Python 3.12.3 を使用して作成されています。
from datetime import datetime, timedelta
# 例 1: ISO 8601 形式の日付のみの文字列を datetime オブジェクトに変換
iso_format = "2024-05-26"
dt = datetime.datetime.fromisoformat(iso_format)
print(dt) # 2024-05-26 00:00:00.000000
# 例 2: ISO 8601 形式の日付と時刻の文字列を datetime オブジェクトに変換
iso_format = "2024-05-26T17:58:00.000"
dt = datetime.datetime.fromisoformat(iso_format)
print(dt) # 2024-05-26 17:58:00.000000
# 例 3: ISO 8601 形式の日付と時刻とタイムゾーンの文字列を datetime オブジェクトに変換
iso_format = "2024-05-26T17:58:00.000+07:00"
dt = datetime.datetime.fromisoformat(iso_format)
print(dt) # 2024-05-26 17:58:00.000000+07:00
# 例 4: 文字列とオフセット値を使用して、特定のタイムゾーンにおける日時を表現
iso_format = "2024-05-26T10:58:00.000"
offset = timedelta(hours=7) # UTC+7 のオフセット
dt = datetime.datetime.fromisoformat(iso_format, offset=offset)
print(dt) # 2024-05-26 17:58:00.000000+07:00
# 例 5: フォーマット文字列を使用して、datetime オブジェクトを ISO 8601 形式の文字列に変換
dt = datetime.datetime.now()
iso_format = dt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
print(iso_format) # 例: 2024-05-26T17:59:00.000000Z
これらの例は、datetime.datetime.fromisoformat()
関数の基本的な使い方を示しています。この関数は、様々な状況に合わせて柔軟に使用することができます。
- コードを実行する前に、
datetime
モジュールをインポートする必要があります。 - 上記のコードは、Python 3.7 以降で実行する必要があります。
datetime
モジュールの詳細については、公式ドキュメントを参照してください。
strptime() 関数を使用する
strptime()
関数は、文字列を特定の形式で解析し、datetime
オブジェクトに変換するために使用されます。ISO 8601 形式の文字列を解析するには、以下の形式指定文字列を使用します。
"%Y-%m-%dT%H:%M:%S.%f"
例:
from datetime import datetime
iso_format = "2024-05-26T17:58:00.000"
dt = datetime.strptime(iso_format, "%Y-%m-%dT%H:%M:%S.%f")
print(dt) # 2024-05-26 17:58:00.000000
正規表現を使用する
正規表現を使用して、ISO 8601 形式の文字列を解析し、個々のコンポーネント (年、月、日、時、分、秒) を抽出することもできます。抽出したコンポーネントを使用して、datetime
オブジェクトを作成することができます。
import re
iso_format = "2024-05-26T17:58:00.000"
match = re.match(r"(\d{4})-(\d{1,2})-(\d{1,2})T(\d{1,2}):(\d{1,2}):(\d{1,2})(.{3})?", iso_format)
if match:
year, month, day, hour, minute, second, microsecond = match.groups()
dt = datetime(year=int(year), month=int(month), day=int(day),
hour=int(hour), minute=int(minute), second=int(second),
microsecond=int(microsecond))
print(dt) # 2024-05-26 17:58:00.000000
else:
print("Invalid ISO 8601 format")
サードパーティ製のライブラリを使用する
dateutil
や arrow
などのサードパーティ製のライブラリには、ISO 8601 形式の文字列を解析するための便利な機能が含まれています。
例: dateutil を使用する
from dateutil.parser import parse
iso_format = "2024-05-26T17:58:00.000"
dt = parse(iso_format)
print(dt) # 2024-05-26 17:58:00.000000
例: arrow を使用する
import arrow
iso_format = "2024-05-26T17:58:00.000"
dt = arrow.parse(iso_format)
print(dt) # <Arrow [2024-05-26 17:58:00+00:00]>
各方法の比較
- サードパーティ製のライブラリを使用する方法は、便利な機能を提供しますが、ライブラリのインストールとインポートが必要となります。
- 正規表現を使用する方法は、より柔軟性がありますが、複雑さも増します。
strptime()
関数は、より汎用性があり、ISO 8601 以外にも様々な形式の文字列を解析することができます。datetime.datetime.fromisoformat()
関数は、最も簡潔で使いやすい方法です。
どの方法を使用するかは、個々のニーズと要件によって異なります。
- サードパーティ製のライブラリは、便利な機能を提供することができますが、その必要性を評価する必要があります。
- 複雑な解析が必要な場合は、正規表現を使用する方が良いかもしれません。
- より汎用性のある方法が必要な場合は、
strptime()
関数を使用することを検討してください。 - シンプルで使いやすい方法を求めている場合は、
datetime.datetime.fromisoformat()
関数を使用することをお勧めします。
- [Python datetime module documentation](