1. ホーム
  2. python

[解決済み] Pythonでdateutilを使わずにタイムゾーンを考慮した文字列をdatetimeに変換する方法とは?

2022-10-05 13:46:47

質問

のようなタイムゾーンを考慮した文字列を変換する必要があります。 "2012-11-01T04:16:13-04:00" を Python の datetime オブジェクトに変換します。

を見ると dateutil モジュールにパース機能があるのを見ましたが、依存関係が追加されるのであまり使いたくありません。

では、どうすればいいのでしょうか?私は以下のようなことを試しましたが、うまくいきませんでした。

datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")

どのように解決するのですか?

Python 3.7時点では datetime.datetime.fromisoformat() はあなたのフォーマットを扱うことができます。

>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

古いバージョンのPythonでは、タイムゾーンを手動で定義しなければなりません。

Pythonはタイムゾーンデータベースを含んでいません、なぜならあまりにも早く古くなってしまうからです。代わりに、Pythonは、適切に設定されたタイムゾーンを提供するために、はるかに速いリリースサイクルを持つことができる外部ライブラリに依存します。

副次的な効果として、これはタイムゾーン のパース も外部ライブラリである必要があることを意味します。もし dateutil が重すぎる場合は iso8601 を使えば、特定の書式をうまくパースしてくれます。

>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)

iso8601 なんと 4KB と小さくなっています。比較すると python-dateutil の 148KB と比べてみてください。

Python 3.2 Python の時点で は単純なオフセットベースのタイムゾーンを扱えるようになり %z をパースします。 -hhmm+hhmm といったタイムゾーンのオフセットがタイムスタンプに含まれます。つまり、ISO 8601 のタイムスタンプの場合は : を削除する必要があります。

>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))

ISO 8601 の適切なパース処理の欠如を追跡するために Python issue 15873 で追跡されています。 .