110

"2012-11-01T04:16:13-04:00"タイムゾーン対応の文字列をPythondatetimeオブジェクトに変換する必要があります。

解析関数を持つモジュールを見ましたdateutilが、依存関係が追加されるため、実際には使用したくありません。

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

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

7 に答える 7

127

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小さいですそのtotpython-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)))

適切なISO8601解析の欠如は、 Pythonの問題15873で追跡されています。

于 2012-11-01T17:13:35.110 に答える
63

これは、dateutilパッケージを使用したdatetimeオブジェクトのPythonドキュメントです。

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
于 2016-04-12T07:18:09.597 に答える
22

元の質問のコードには2つの問題があります。タイムゾーンにを含めるべきではないことと、「オフセットとしてのタイムゾーン」:のフォーマット文字列が大文字ではなく小文字であるということです。%z%Z

これはPythonv3.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
于 2017-06-14T01:48:00.597 に答える
5

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

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')
于 2019-03-25T11:04:15.447 に答える
3

タイムゾーンに対応しないオブジェクトを作成し、を置き換えて、後でtzinfoタイムゾーンに対応するDateTimeオブジェクトにすることができます。

from datetime import datetime
import pytz

unware_time = datetime.strptime("2012-11-01 04:16:13", "%Y-%m-%d %H:%M:%S")
aware_time = unaware_time.replace(tzinfo=pytz.UTC)
于 2021-06-24T14:57:14.490 に答える
1

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)

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

于 2017-06-01T14:39:54.420 に答える
1

Mohideen bin Mohammedによるdateutilを使用するためのこの提案は、小さなライブラリが必要な場合でも、間違いなく最良の解決策です。そこで他のアプローチを使用したことで、さまざまな形の失敗が発生しやすくなりました。これには、このための優れた関数があります。

from dateutil.parser import parse


def parse_date_convert(date, fmt=None):
    if fmt is None:
        fmt = '%Y-%m-%d %H:%M:%S' # Defaults to : 2022-08-31 07:47:30
    get_date_obj = parse(str(date))
    return str(get_date_obj.strftime(fmt))

dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']

for date in dates:
    print(f'Before: {date}  After: {parse_date_convert(date)}')

結果:

Before: 2022-08-31T07:47:30Z  After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z  After: 2022-08-31 07:47:29
Before: 2017-05-27T07:20:18.000-04:00  After: 2017-05-27 07:20:18
Before: 2012-11-01T04:16:13-04:00  After: 2012-11-01 04:16:13

このようにTZを置き換えるスライススプリットなどのさまざまな形式を試しました:

dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']

for date in dates:
    print(f'Before: {date}  After: {date.replace("T", " ").replace("Z", "")}')

あなたはまだ標準以下の結果を残されています。以下のように

Before: 2022-08-31T07:47:30Z  After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z  After: 2022-08-31 07:47:29.098
Before: 2017-05-27T07:20:18.000-04:00  After: 2017-05-27 07:20:18.000-04:00
Before: 2012-11-01T04:16:13-04:00  After: 2012-11-01 04:16:13-04:00
于 2021-03-27T20:26:34.793 に答える