PythonでISO8601形式の日付時刻文字列をdatetimeオブジェクトに変換する方法

2024-05-27

Python の Data Types における datetime.datetime.fromisoformat() の詳細解説

Python の datetime モジュールは、日付と時刻を扱うための強力なツールを提供しています。その中でも、datetime.datetime.fromisoformat() 関数は、ISO 8601 形式の文字列を datetime オブジェクトに変換するために使用されます。この関数は、日付と時刻を扱うプログラミングにおいて非常に役立ちます。

ISO 8601 形式は、日付と時刻を表現するための国際的な標準規格です。この形式は、世界中で広く使用されており、様々なシステム間でのデータ交換を容易にします。ISO 8601 形式には、以下の種類があります。

  • 日付のみ: YYYY-MM-DD (例: 2024-05-26)
  • 日付と時刻: YYYY-MM-DDTHH:MM:SS[.mmm] (例: 2024-05-26T17:58:00.000)

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
  • iso_format 引数は、有効な ISO 8601 形式の文字列である必要があります。
  • この関数は、Python 3.7 以降でのみ使用できます。

datetime.datetime.fromisoformat() 関数は、ISO 8601 形式の文字列を datetime オブジェクトに変換するための便利なツールです。この関数は、日付と時刻を扱うプログラミングにおいて、様々な場面で役立ちます。

    • この解説は、Python 3.12.3 を使用して作成されています。
    • その他の datetime モジュールの機能については、公式ドキュメントを参照してください。


    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() 関数の基本的な使い方を示しています。この関数は、様々な状況に合わせて柔軟に使用することができます。

    補足

    • 上記のコードは、Python 3.7 以降で実行する必要があります。
    • コードを実行する前に、datetime モジュールをインポートする必要があります。
    • サンプルコードはあくまで一例であり、必要に応じて変更することができます。
    • 日付と時刻を扱うその他のライブラリやツールも存在します。


    Python で ISO 8601 形式の文字列を datetime オブジェクトに変換するその他の方法

    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() 関数を使用することを検討してください。
    • 複雑な解析が必要な場合は、正規表現を使用する方が良いかもしれません。
    • サードパーティ製のライブラリは、便利な機能を提供することができますが、その必要性を評価する必要があります。
    • [Python datetime module documentation](