どのようにしてtime.struct_timeオブジェクトをdatetimeオブジェクトに変換しますか?


288

Python time.struct_timeオブジェクトをどのようにオブジェクトに変換しdatetime.datetimeますか?

最初のライブラリを提供するライブラリと2番目のライブラリを必要とする2番目のライブラリがあります。

回答:


384

利用はtime.mktime()エポックは、その後、使用しているため(localtimeのでは)時間のタプルを秒に変換するには()をdatetime.fromtimestamp DateTimeオブジェクトを取得します。

from datetime import datetime
from time import mktime

dt = datetime.fromtimestamp(mktime(struct))

45
これは1900年までに失敗することに注意してください。現代人はこの制限を決して覚えていません。
mlissner 2012

3
これでtm_isdstデータが失われますか?私はそうだと思いますが、結果の日時オブジェクトはNone.dst()たとえであっても、戻ってくる程度まで素朴なままstruct.tm_isdstです1
n611x007 2014年

3
これは通常は機能します。ただし、時間タプルがmktimeが受け入れる値(たとえば、値(1970、1、1、0、0、0、0、1、-1)の場合)を超えると失敗します。このタプルを返すHTTPリクエストでDateヘッダーを解析した後、これに遭遇しました。
user3820547 2014

3
@richvdh:C標準でmktime()は、これtm_isdstを考慮に入れる必要があると指定されており、Python time.mktime()mktime()CPythonでC 関数を呼び出します。mktime()もしそれが(エンド・オブ・DST(「フォールバック」)の移行時に、例えば)あいまいで間違ったローカルタイムが選ぶことstruct.tm_isdstである-1場合や、mktime()特定のプラットフォーム上で無視入力を tm_isdst。また、ローカルタイムゾーンの過去のutcオフセットが異なっていて、C mktime()が古いutcオフセット値を提供できる履歴tzデータベースを使用していないmktime()場合も、誤った値(1時間単位など)を返すことがあります。
jfs

1
@naxa:与えられたプラットフォームでmktime()無視しない場合tm_isdst(それは私のものです)fromtimestamp()、情報を確実に失います:現地時間を表す返されたナイーブ datetimeオブジェクトがあいまいかもしれません(タイムスタンプ->現地時間は確定的です(うるう秒を無視する場合)が、local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also, fromtimestamp() `が履歴tzデータベースを使用しない場合、間違ったutcオフセットを選択する可能性があります
jfs

123

このような:

>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)

3
#import time、datetimeを忘れないでください
jhwist 2009年

7
@jhwist-人々が自分でそれを理解するのに信頼できるいくつかのこと:)
orip 2009年

14
*and **構文を@rodling することで、listyまたはdictyタイプのオブジェクトを個別の引数に拡張できます。これは、私のお気に入りのPythonの可愛さの1つです。詳細については、docs.python.org / 2 / tutorial /…を参照してください
OrganicPanda 2013年

10
struct_timeにうるう秒がある場合、これによりValueErrorが発生することに注意してください。例:t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
berdario

7
@berdario:と互換性のある値を返すdatetimedatetime(*t[:5]+(min(t[5], 59),))たとえば、受け入れる"2015-06-30 16:59:60 PDT"
jfs

37

これはあなたの質問に対する直接の回答ではありません(すでにかなりよく回答されています)。しかし、何度もファンダメンタルを何度も私に噛まれたことがあるので、time.struct_timeオブジェクトが提供するものと他の時間フィールドが何を持っているのかを注意深く検討する必要があることを強調することはできません。

time.struct_timeオブジェクトと他の日付/時刻文字列の両方があると想定して、2つを比較し、データを失ったり、意図せずに単純なdatetimeオブジェクトを作成したりしないでください。

たとえば、優れたfeedparserモジュールは「published」フィールドを返し、time.struct_timeオブジェクトを「published_pa​​rsed」フィールドに返す場合があります。

time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)

ここで、「公開済み」フィールドで実際に何が得られるかに注意してください。

Mon, 09 Sep 2013 19:57:42 -0400

ストールマンのひげによって!タイムゾーン情報!

この場合、怠惰な人は優れたdateutilモジュールを使用してタイムゾーン情報を保持したい場合があります。

from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()

それは私たちに与えます:

published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00

次に、タイムゾーン対応のdatetimeオブジェクトを使用して、すべての時間をUTCまたはあなたが素晴らしいと思うものすべてに正規化できます。


7
*_parsedfeedparsedのすべてのフィールドは、日付解析ドキュメントで確認できるようにUTCに既に正規化されているため、これは冗長です。
itorres

1
@itorres:私が理解していれば、この答えはUTCへの正規化ではなく、生の文字列日付を解析するdatetimeときに失われるオブジェクトのタイムゾーン情報を保持することfeedparserです。
davidag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.