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")

サードパーティ製のライブラリを使用する

dateutilarrow などのサードパーティ製のライブラリには、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](