So konvertieren Sie einen ganzzahligen Zeitstempel in Python datetime

187

Ich habe eine Datendatei mit Zeitstempeln wie "1331856000000". Leider habe ich nicht viel Dokumentation für das Format, daher bin ich mir nicht sicher, wie der Zeitstempel formatiert ist. Ich habe Pythons Standard datetime.fromordinal()und datetime.fromtimestamp()einige andere ausprobiert , aber nichts passt dazu. Ich bin mir ziemlich sicher, dass diese bestimmte Nummer dem aktuellen Datum entspricht (z. B. 2012-3-16), aber nicht viel mehr.

Wie konvertiere ich diese Nummer in a datetime?

Cerin
quelle

Antworten:

328

datetime.datetime.fromtimestamp()ist korrekt, außer dass Sie wahrscheinlich einen Zeitstempel in Millisekunden haben (wie in JavaScript), aber einen fromtimestamp()Unix-Zeitstempel in Sekunden erwarten.

Mach es so:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

und das Ergebnis ist:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

Beantwortet es Ihre Frage?

EDIT : JF Sebastian hat richtig vorgeschlagen, die wahre Division durch 1e3(float 1000) zu verwenden. Der Unterschied ist signifikant, wenn Sie genaue Ergebnisse erhalten möchten, daher habe ich meine Antwort geändert. Der Unterschied ergibt sich aus dem Standardverhalten von Python 2.x, das intbeim Teilen (mit dem /Operator) intdurch int(dies wird als Bodenteilung bezeichnet ) immer zurückgegeben wird. Durch Ersetzen des Divisors 1000(als int) durch den 1e3Divisor ( 1000als Float) oder durch float(1000)(oder 1000.usw.) wird die Division zur wahren Division . Python 2.x kehrt zurück, floatwenn intdurch float, floatdurch int, geteilt wirdfloatvon floatusw. Und wenn der an die fromtimestamp()Methode übergebene Zeitstempel einen Bruchteil enthält, enthält das Ergebnis dieser Methode auch Informationen zu diesem Bruchteil (als Anzahl der Mikrosekunden).

Tadeck
quelle
13
Verwenden Sie wahre Division:/ 1e3
JFS
@JFSebastian: Sie sind völlig korrekt, ich habe meine Antwort bearbeitet und eine Erklärung hinzugefügt, warum Sie Recht haben. Wenn Sie mit der Erklärung nicht einverstanden sind, lassen Sie es mich bitte wissen.
Tadeck
@ manu-fatto: Das ist eigentlich egal. x * 0.001und x / 1e3beide gleich sind, liegt der Unterschied in der Notation und Länge (die ursprüngliche ist kürzer). Für manche Menschen ist es möglicherweise klarer, tatsächlich durch die Zahl zu dividieren, anstatt mit der von Ihnen vorgeschlagenen multiplikativen inversen Zahl ( 1/x) zu multiplizieren . Aber danke, dass Sie einen alternativen Ansatz vorgeschlagen haben.
Tadeck
57
Diese Funktion ist gefährlich, da Sie die Zeitzone berücksichtigen. Versuchen Sie, utcfromtimestamp
Haim Bender
11
@HaimBender Danke! Ich bin der Meinung, dass Ihre Kommentare mehr Aufmerksamkeit verdienen. fromtimestampGeben Sie Datum und Uhrzeit in Ortszeit an. Geben Sie utcfromtimestampDatum und Uhrzeit in UTC an.
Yusong