web-dev-qa-db-ja.com

python dateutilなしでタイムゾーン対応文字列をdatetimeに変換する方法は?

タイムゾーン対応の文字列をpython datetimeオブジェクトに変換する必要があります。

例えば ​​2012-11-01T04:16:13-04:00

それを行うための解析関数を持っているdateutilモジュールがありますが、依存関係が追加されるため、実際には使用したくありません。

どうすればそれができますか?私は次のようなものを試しましたが、運がありません。

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

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は、リリースサイクルをはるかに高速化できる外部ライブラリを使用して、適切に構成されたタイムゾーンを提供します。

副作用として、これはタイムゾーンparsingも外部ライブラリである必要があることを意味します。 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'>)

iso8601whopping4KB小さいです。その合計python-dateutilの148KBを比較します。

Python 3.2 Python)canは、単純なオフセットベースのタイムゾーンを処理し、 %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 1587 で追跡されています。

61
Martijn Pieters

以下は、dateutilパッケージを使用したdatetimeオブジェクトのPython Doc です。

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
34

元の質問のコードには2つの問題があります::のタイムゾーンと"オフセットとしてのタイムゾーン"のフォーマット文字列は小文字の%z上部ではありません%Z

これはPython v3.6で動作します

>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00
3
Jamie Czuy

私はPythonは初めてですが、変換する方法を見つけました

2017-05-27T07:20:18.000-04:00

2017-05-27T07:20:18新しいユーティリティをダウンロードせずに。

from datetime import datetime, timedelta

time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04

item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)

文字列をあま​​りスライスせずにこれを行うより良い方法があると確信していますが、これで仕事は完了しました。

1
wiseco68

このように変換できます。

date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
0
Muruganandam C