1. ホーム
  2. パイソン

[解決済み】Python strptime()とタイムゾーンの関係?

2022-04-10 21:31:16

質問

IPDDumpを使用して作成したBlackberry IPDバックアップのCSVダンプファイルがあります。 この中の日付/時間文字列は次のようなものです。 (ここで EST はオーストラリアのタイムゾーン)。

Tue Jun 22 07:46:22 EST 2010

Pythonでこの日付をパースできるようにする必要があります。最初、私は strptime() 関数を使用します。

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')

ところが、なぜか datetime オブジェクトが返されないようです。 tzinfo が関連付けられています。

を読みました。 このページ というのは、どうやら datetime.strptime を無言で破棄する tzinfo しかし、ドキュメントを確認したところ、そのような記述は見当たりません。 ここで .

サードパーティのPythonライブラリを使って、日付をパースさせることができました。 データーユーティル しかし、私はまだ、内蔵の strptime() が間違っているのでは? 何か strptime() タイムゾーンをうまく使うには?

解決方法は?

その datetime モジュールドキュメント は言う。

date_string に対応する datetime を、フォーマットに従ってパースして返します。これは以下と同等である。 datetime(*(time.strptime(date_string, format)[0:6])) .

参照 [0:6] ? That gets you (year, month, day, hour, minute, second) . 他には何もありません。タイムゾーンの記載はありません。

興味深いことに、[Win XP SP2, Python 2.6, 2.7] あなたの例を渡すと time.strptime は動作しませんが、" %Z" と " EST" を取り除くと動作するようになります。また、"EST" の代わりに "UTC" または "GMT" を使ってもうまくいきますが、 "PST" と "MEZ" ではうまくいかないようです。不可解です。

なお、これはバージョン3.2時点で更新されており、同じドキュメントに以下のように記載されています。

strptime() メソッドに %z ディレクティブを指定すると、aware datetime オブジェクトが生成されます。その結果のtzinfoはtimezoneインスタンスに設定されます。

なお、これは%Zでは動作しないので、大文字小文字は重要です。次の例を参照してください。

In [1]: from datetime import datetime

In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z')

In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: None

In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z')

In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: UTC+10:00