Entschuldigung für die einfache Frage ... Ich bin neu in Python ... Ich habe mich umgesehen und nichts scheint zu funktionieren.
Ich habe eine Reihe von Datums- / Uhrzeitobjekten und möchte die Anzahl der Sekunden seit einer festgelegten Zeit in der Vergangenheit für jedes Objekt berechnen (z. B. 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.
python
python-2.7
Nathan Lippi
quelle
quelle
datetime.date
in UTC-Zeitstempel in Pythonint(t.timestamp())
Antworten:
Für das Sonderdatum 1. Januar 1970 gibt es mehrere Möglichkeiten.
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 einetotal_seconds()
Funktion hat.Das Startdatum wird normalerweise in UTC angegeben. Für korrekte Ergebnisse sollte die
datetime
Eingabe in diese Formel auch in UTC erfolgen. Wenn Siedatetime
noch nicht in UTC sind, müssen Sie es konvertieren, bevor Sie es verwenden, oder einetzinfo
Klasse mit dem richtigen Offset anhängen .Wie in den Kommentaren erwähnt, benötigen Sie am Startdatum auch eine, wenn Sie eine
tzinfo
an Ihre angehängt haben.datetime
Andernfalls schlägt die Subtraktion fehl. Für das obige Beispiel würde ich hinzufügen,tzinfo=pytz.utc
wenn Python 2 odertzinfo=timezone.utc
Python 3 verwendet wird.quelle
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
Ich habe dies verwendet, um die "Epoche" leicht zu bekommen. Beachten Sie, dass die Epoche nicht immer auf allen Systemen gleich ist.time.time()
unddatetime.now() - datetime(1970, 1, 1)
um 7200 Sekunden abweicht. Eher benutzen(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Sie nicht verwenden ,utcfromtimestamp(0)
wenn Sie ein Datetime in Ihrer lokalen Zeitzone konvertieren möchten.So erhalten Sie die Unix-Zeit (Sekunden seit dem 1. Januar 1970):
quelle
t
eine Ortszeit ist. Der UTC-Offset für die lokale Zeitzone war in der Vergangenheit möglicherweise anders. Wennmktime()
(C-Bibliothek) auf einer bestimmten Plattform keinen Zugriff auf historische Zeitzonendaten hat, kann dies fehlschlagen (diespytz
ist eine tragbare Methode für den Zugriff auf die tz-Datenbank). Außerdem kann die Ortszeit mehrdeutig sein, z. B. während der Sommerzeitübergänge - Sie benötigen zusätzliche Informationen, um eindeutig zu sein, z. B. wenn Sie wissen, dass aufeinanderfolgende Datums- / Zeitwerte in einer Protokolldatei ansteigen solltentime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
führt dazu1564819506.0
, dass die Millisekunden stillschweigend fallen gelassen werden, aberdatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(Andrzej Pronobis 'Antwort) ergibt1564819506.912
das erwartete Ergebnis.Ab Python 3.3 wird dies mit der
datetime.timestamp()
Methode sehr einfach . Dies ist natürlich nur dann nützlich, wenn Sie die Anzahl der Sekunden ab dem 01.01.1970 UTC benötigen.Der Rückgabewert ist ein Float, der gerade Bruchteile einer Sekunde darstellt. Wenn die Datums- und Uhrzeitzeitzone naiv ist (wie im obigen Beispiel), wird davon ausgegangen, dass das Datums- / Uhrzeitobjekt die Ortszeit darstellt, dh die Anzahl der Sekunden von der aktuellen Uhrzeit an Ihrem Standort bis zum 01.01.1970 UTC.
quelle
Vielleicht nicht zum Thema: UNIX / POSIX-Zeit von datetime abrufen und zurückkonvertieren:
Beachten Sie, dass unterschiedliche Zeitzonen Auswirkungen auf die Ergebnisse haben, z. B. meine aktuelle TZ / DST-Rendite:
Daher sollte eine Normalisierung auf UTC in Betracht gezogen werden, indem UTC-Versionen der Funktionen verwendet werden.
Beachten Sie, dass das vorherige Ergebnis verwendet werden kann, um den UTC-Versatz Ihrer aktuellen Zeitzone zu berechnen. In diesem Beispiel ist dies + 1h, dh UTC + 0100.
Verweise:
quelle
mktime()
kann fehlschlagen . Im Allgemeinen müssen Siepytz
die Ortszeit in utc konvertieren, um den POSIX-Zeitstempel zu erhalten.int (t.strftime("%s"))
funktioniert auchquelle
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(wie von OP angegeben). Aber ich bezweifle wirklich, dass% s ein kürzlich hinzugefügtes Zeitformat ist.%s
wird nicht unterstützt (es kann auf einigen Plattformen funktionieren, wennt
f ein naives datetime-Objekt ist, das die lokale Zeit darstellt, und wenn die lokale C-Bibliothek Zugriff auf die tz-Datenbank hat, andernfalls kann das Ergebnis falsch sein). Benutze es nicht.%s
ist nirgendwo dokumentiert. Ich habe es in echtem Code gesät und mich gefragt, was das ist und in der Dokumentation nachgesehen und es gibt keine%s
. Es gibt nur mit großem S nur für die Sekunden.aus den Python-Dokumenten:
Gibt die Gesamtzahl der Sekunden zurück, die in der Dauer enthalten sind. Gleichwertig
berechnet mit aktivierter wahrer Division.
Beachten Sie, dass diese Methode bei sehr großen Zeitintervallen (auf den meisten Plattformen länger als 270 Jahre) an Mikrosekundengenauigkeit verliert.
Diese Funktionalität ist neu in Version 2.7.
quelle
So konvertieren Sie ein Datum / Uhrzeit-Objekt, das die Zeit in UTC darstellt, in einen POSIX-Zeitstempel :
So konvertieren Sie ein Datum / Uhrzeit-Objekt, das die Zeit in der lokalen Zeitzone darstellt, in einen POSIX-Zeitstempel:
Siehe Wie konvertiere ich die Ortszeit in Python in UTC? Wenn die tz-Datenbank auf einer bestimmten Plattform verfügbar ist; Möglicherweise funktioniert nur eine stdlib-Lösung .
Folgen Sie den Links, wenn Sie Lösungen für
<3.3
Python-Versionen benötigen .quelle
Ich habe den Kalender.timegm der Standardbibliothek ausprobiert und es funktioniert ganz gut:
Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm
quelle
aDateTime