Pythonでは、 `datetime`オブジェクトを秒にどのように変換しますか?


226

簡単な質問への謝罪...私はPythonに不慣れです...私は周りを検索しましたが、何も機能していないようです。

多数のdatetimeオブジェクトがあり、それぞれの過去の固定時間からの秒数を計算したい(たとえば、1970年1月1日以降)。

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

これは、日付が異なる日付の間でのみ異なるようです:

t.toordinal()

どんな助けでも大歓迎です。



2
私はおそらくエポックからSの両方に変換し、そこから行くと思います: int(t.timestamp())
nerdwaller

反対の操作の場合はここに移動します:convert-seconds-since-epoch-to-a-datetime-object
Trevor Boyd Smith

回答:


233

1970年1月1日の特別な日付には、複数のオプションがあります。

他の開始日については、2つの日付の差を秒単位で取得する必要があります。2つの日付を減算すると、timedeltaオブジェクトが得られます。このオブジェクトには、Python 2.7以降、total_seconds()関数があります。

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

開始日は通常UTCで指定されるため、適切な結果を得るには、datetimeこの数式に入力する値もUTCである必要があります。datetimeがUTCに含まれていない場合は、使用する前に変換するか、tzinfo、適切なオフセットを持つクラスを必要があります。

コメントに記載されているように、tzinfo添付datetimeファイルがある場合は、開始日に添付する必要があります。そうしないと、減算が失敗します。上記の例では、tzinfo=pytz.utcPython 2またはtzinfo=timezone.utcPython 3を使用する場合に追加します。


1
Pythonが警告を出します:「TypeError:オフセットナイーブとオフセット対応の日時を減算できません」これを修正するための最良の解決策は何ですか?
アーロンアッシュ

2
@Charybdis、試してみてくださいdatetime.datetime(1970,1,1,tzinfo=pytz.utc)
Mark Ransom

9
使用を検討してください:datetime.datetime.utcfromtimestamp(0) 「エポック」を簡単に取得するためにこれを使用しました。エポックはすべてのシステムで常に同じであるとは限らないことに注意してください。
DA

3
ここのタイムゾーンには十分注意してください。私はの出力というUTC + 2、手段でだtime.time()とはdatetime.now() - datetime(1970, 1, 1)7200秒異なります。むしろ使用(t - datetime.datetime.fromtimestamp(0)).total_seconds()。ローカルタイムゾーンで日時を変換する場合使用しないutcfromtimestamp(0)でください。
カール

2
@DA:Pythonは非POSIXエポックをサポートしていません。Pythonが動作するすべてのシステムは同じエポックを使用します:
1970-01-01

130

Unix時間(1970年1月1日からの秒数)を取得するには:

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

22
現地時間のそれの明示し、それのプラットフォームに依存するためにはtime.mktimeを使用する際に注意が必要
シーズー-温家宝蘇

7
本当に注意してください。それは私のお尻の大きな時間に私をかみました
Arg

それはt現地時間であると想定しています。ローカルタイムゾーンのUTCオフセットは以前とは異なる場合があり、mktime()(Cライブラリ)が特定のプラットフォームの履歴タイムゾーンデータにアクセスできない場合、失敗する可能性があります(pytztzデータベースにアクセスするためのポータブルな方法です)。また、DSTの移行中など、現地時間があいまいになる可能性があります。たとえば、ログファイルで連続した日付/時刻の値が増加していることがわかっている場合は、
jfs

1
1秒未満の時間でこれを使用する場合は注意してください。time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())その結果1564819506.0、ミリ秒は静かに低下しますが、datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()(Andrzej Pronobisの回答)1564819506.912は期待される結果になります。
Alex

128

Python 3.3から、このdatetime.timestamp()方法でこれは非常に簡単になりました。もちろん、これは1970-01-01 UTCからの秒数が必要な場合にのみ役立ちます。

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

戻り値は、1秒未満の端数を表す浮動小数点数になります。datetimeがタイムゾーンナイーブである場合(上記の例のように)、datetimeオブジェクトは現地時間を表すと想定されます。つまり、現在の時刻から1970-01-01 UTCまでの秒数になります。


3
誰がこれに反対票を投じたのか、理由を説明してもらえますか?
Andrzej Pronobis 2015年

5
私は、反対票は質問のpython-2.7タグによるものだと思います(これは単なる推測です)。
jfs 2015

3
これは承認済みの回答である必要があります。承認済みの回答はそれに応じて更新する必要があります。
DreamFlasher 2016

11
アップグレードする時間だと思います;)
DreamFlasher 2017

別の開始日からこの距離を計算することは可能ですか?(
1970-01-01の

29

多分主題外:UNIX / POSIX時間をdatetimeから取得して変換する:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

異なるタイムゾーンが結果に影響を与えることに注意してください。たとえば、現在のTZ / DSTは以下を返します。

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

したがって、関数のUTCバージョンを使用してUTCに正規化することを検討する必要があります。

以前の結果を使用して、現在のタイムゾーンのUTCオフセットを計算できることに注意してください。この例では、これは+ 1h、つまりUTC + 0100です。

参照:


mktime()失敗するかもしれません。一般に、pytzPOSIXタイムスタンプを取得するには、現地時間をutcに変換する必要があります。
jfs 2015

calendar.timegm()はtime.mktime()のUTCバージョンのようです
フランクスター

27

int (t.strftime("%s")) も動作します


1
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)(OPで指定されている)Python 2.7で動作します。しかし、実際には、%sが最近追加された時刻形式ではないかと思います。
dan3 14

1
@ dan3:間違っています。%sはサポートされていません(一部のプラットフォームでは動作する可能性がありますtが、ローカル時刻を表す単純なdatetimeオブジェクトであり、ローカルCライブラリがtzデータベースにアクセスできる場合は、結果が間違っている可能性があります)。使用しないでください。
jfs 2015

%sどこにも文書化されていません。私はそれを実際のコードに播種し、これが何であるか疑問に思っていて、ドキュメントを見て、などというものはありませんでした%s。ほんの数秒だけビッグSでしかありません。
VStoykov 2016年

13

Pythonドキュメントから:

timedelta.total_seconds()

期間に含まれる合計秒数を返します。に相当

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

真の除算を有効にして計算されます。

非常に長い時間間隔(ほとんどのプラットフォームで270年を超える)では、このメソッドはマイクロ秒の精度を失うことに注意してください。

この機能はバージョン2.7の新機能です。


1
計算に小さな問題があり、10 * 6ではなく 10 6でなければなりません... td.microseconds +(td.seconds + td.days * 24 * 3600)* 10 6)/ 10 ** 6
sdu

@sdu great catch-ダブルアスタリスクは私の答えにありますが、stackoverflowはそれを消費し、テキストを太字にするだけを修正しようとします。
Michael

2

UTCで時刻を表すdatetimeオブジェクトをPOSIXタイムスタンプに変換するには

from datetime import timezone

seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

ローカルタイムゾーンの時刻を表すdatetimeオブジェクトをPOSIXタイムスタンプに変換するには:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

Pythonで現地時間をUTCに変換する方法を参照してくださいtzデータベースが特定のプラットフォームで使用できる場合。stdlibのみのソリューションが機能する場合があります。

<3.3Pythonバージョンのソリューションが必要な場合は、リンクをたどってください。


1

標準ライブラリのcalendar.timegmを試してみましたが、うまく機能します。

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

参照:https : //docs.python.org/2/library/calendar.html#calendar.timegm


1秒の端数を取り除きます。それはそれは前提としてaDateTimeUTC時間である
JFS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.