Wie konvertiert man ein Python-Datetime-Objekt in Sekunden?


Answers

Für das besondere Datum des 1. Januar 1970 gibt es mehrere Optionen.

Für jedes andere Startdatum müssen Sie die Differenz zwischen den beiden Daten in Sekunden ermitteln. Das Subtrahieren von zwei Daten ergibt ein timedelta Objekt, das ab Python 2.7 eine total_seconds() -Funktion hat.

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

Das Startdatum wird normalerweise in UTC angegeben. Für korrekte Ergebnisse sollte das datetime Sie in diese Formel datetime , ebenfalls in UTC angegeben sein. Wenn Ihre datetime nicht bereits in UTC ist, müssen Sie sie konvertieren, bevor Sie sie verwenden, oder eine tzinfo Klasse anhängen, die über den richtigen Offset verfügt.

Wie in den Kommentaren angemerkt, wenn du ein tzinfo an deine tzinfo angehängt hast, datetime du auch eines am Startdatum oder die Subtraktion wird fehlschlagen; Für das obige Beispiel würde ich tzinfo=pytz.utc hinzufügen, wenn Python 2 oder tzinfo=timezone.utc wenn Python 3 verwendet wird.

Question

Entschuldigung für die einfache Frage ... Ich bin neu bei Python ... Ich habe gesucht und nichts scheint zu funktionieren.

Ich habe eine Reihe von datetime Objekten und ich möchte die Anzahl der Sekunden seit einer festen Zeit in der Vergangenheit für jeden einzelnen berechnen (zum Beispiel seit dem 1. Januar 1970).

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

Dies scheint nur zwischen Daten zu unterscheiden, die unterschiedliche Tage haben:

t.toordinal()

Jede Hilfe wird sehr geschätzt.




Um die Unix-Zeit (Sekunden seit dem 1. Januar 1970) zu erhalten:

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



Vielleicht vom Thema weg: um die UNIX / POSIX-Zeit von Datetime zu bekommen und sie zurück zu konvertieren:

>>> 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)

Beachten Sie, dass verschiedene Zeitzonen Auswirkungen auf die Ergebnisse haben, zB mein aktueller TZ / DST-Rückgabewert:

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

Daher sollte man eine Normalisierung auf UTC in Erwägung ziehen, indem man UTC-Versionen der Funktionen verwendet.

Beachten Sie, dass das vorherige Ergebnis zur Berechnung des UTC-Offsets Ihrer aktuellen Zeitzone verwendet werden kann. In diesem Beispiel ist dies + 1h, dh UTC + 0100.

Verweise:




Ich habe die kalender.zeitleiste der standard library ausprobiert und es funktioniert ganz gut:

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

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




Ausgehend von Python 3.3 wird dies mit der Methode datetime.timestamp() . Dies ist natürlich nur nützlich, wenn Sie die Anzahl der Sekunden ab 1970-01-01 UTC benötigen.

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

Der Rückgabewert ist ein Gleitkommawert, der Sekundenbruchteile repräsentiert. Wenn die Datum / Uhrzeit-Zeitzone naiv ist (wie im obigen Beispiel), wird angenommen, dass das Datum / Uhrzeit-Objekt die lokale Zeit darstellt, dh Es wird die Anzahl der Sekunden von der aktuellen Zeit an Ihrem Standort bis 1970-01-01 UTC sein.




int (t.strftime("%s")) funktioniert auch




So konvertieren Sie ein Datetime-Objekt, das die Zeit in UTC darstellt, in den POSIX-Zeitstempel :

from datetime import timezone

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

So konvertieren Sie ein Datetime-Objekt, das die Zeit in der lokalen Zeitzone darstellt, in den POSIX-Zeitstempel:

import tzlocal # $ pip install tzlocal

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

Siehe Wie konvertiere ich die lokale Zeit in Python in UTC? Wenn die tz-Datenbank auf einer bestimmten Plattform verfügbar ist; Eine stdlib-only-Lösung funktioniert möglicherweise .

Folgen Sie den Links, wenn Sie Lösungen für <3.3 Python-Versionen benötigen.




aus den Python-Dokumenten:

timedelta.total_seconds()

Gibt die Gesamtzahl der Sekunden zurück, die in der Dauer enthalten sind. Gleichwertig

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

berechnet mit True Division aktiviert.

Beachten Sie, dass diese Methode für sehr große Zeitintervalle (mehr als 270 Jahre auf den meisten Plattformen) die Genauigkeit von Mikrosekunden verliert.

Diese Funktionalität ist neu in Version 2.7.