@ Eileur, ja. Die zweite Zahl gibt die Anzahl der Sekunden an, die zwischen dem Beginn der Unix-Epoche und dem angegebenen Datum vergangen sind. Dieses Format wird auch als POSIX-Zeit bezeichnet.
Eikonomega
Antworten:
316
>>>import time
>>>import datetime
>>> s ="01/12/2011">>> time.mktime(datetime.datetime.strptime(s,"%d/%m/%Y").timetuple())1322697600.0
Es wird Mitternacht 01/12/2011 in der lokalen Zeitzone angenommen. Wenn die Eingabe in UTC erfolgt; Sie könnten calendar.timegm()oder.toordinal()
jfs
49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()ist etwas kürzer
timdiels
11
@ Timdiels: wieder. .timestamp()geht von einer Ortszeit anstelle von UTC aus, wenn keine explizite Zeitzone angegeben ist. Der Code in der Antwort funktioniert (erzeugt erwartet 1322697600) nur auf einem Computer, auf dem die lokale Zeitzone keinen UTC-Offset hat.
JFS
7
Dies funktioniert nicht: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d:% H:% M:% S"). timestamp () Traceback ( letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> AttributeError: Das Objekt 'datetime.datetime' hat kein Attribut 'timestamp'
Wenn ich die Beispiele in diesem Beitrag ausführe, wird folgende Fehlermeldung angezeigt : NameError: name 'wckCalendar' is not defined. Ich führe Python 3.4.1 auf einem Windows 32-Bit-Computer aus. Irgendeine Idee? Vielen Dank.
Sedeh
1
@sedeh Es gibt keinen wckCalendar im Beitrag. Überprüfen Sie Ihren Code.
JFS
@JFSebastian Genau, und ich habe nicht versucht, wckCalendar direkt aufzurufen. Es wird nur in der Fehlermeldung angezeigt. Siehe meinen Beitrag hier , in dem das Problem besprochen wird.
Sedeh
1
@ törzsmókus: Wenn die Antwort falsch ist, spielt es keine Rolle, wie lesbar sie ist.
JFS
1
@ törzsmókus: Schau dir meine Antwort an: Es kann zwei verschiedene Zahlen ergeben. Ihre Antwort ergibt eine Zahl, ohne zu erwähnen, welche.
Lesbarkeit zählt. In meiner Antwort mit dateutil finden Sie eine weitaus besser lesbare Lösung.
Törzsmókus
21
Die Antwort hängt auch von Ihrer Zeitzone für das Eingabedatum ab. Wenn Ihr Datum ein lokales Datum ist, können Sie mktime () verwenden, wie katrielalex sagte - nur ich verstehe nicht, warum er datetime anstelle dieser kürzeren Version verwendet hat:
Beachten Sie jedoch, dass mein Ergebnis anders ist als sein, da ich mich wahrscheinlich in einer anderen TZ befinde (und das Ergebnis ein zeitzonenfreier UNIX-Zeitstempel ist).
Wenn das Eingabedatum bereits in UTC liegt, ist meiner Meinung nach die richtige Lösung:
Viele dieser Antworten denken nicht daran, dass das Datum zunächst naiv ist
Um korrekt zu sein, müssen Sie zuerst das naive Datum als zeitzonenabhängige Datums- / Uhrzeitangabe festlegen
import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011','%d/%m/%Y')>>> datetime.datetime(2011,12,1,0,0)# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)>>> datetime.datetime(2011,12,1,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' PST-1 day,16:00:00 STD>)# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)>>> datetime.datetime(2011,12,1,8,0, tzinfo=<UTC>)# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)>>> datetime.datetime(1970,1,1,0,0, tzinfo=<UTC>)# get the total second difference
ts =(d - epoch).total_seconds()>>>1322726400.0
# Don't do this:
d = datetime.datetime(2011,12,1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))>>> datetime.datetime(2011,1,12,0,0,
tzinfo=<DstTzInfo'America/Los_Angeles' LMT-1 day,16:07:00 STD>)# tzinfo in not PST but LMT here, with a 7min offset !!!# when converting to UTC:
d = d.astimezone(pytz.UTC)>>> datetime.datetime(2011,1,12,7,53, tzinfo=<UTC>)# you end up with an offset
Es ist falsch. OP erwartet Zeit im "%d/%m/%Y"Format. Vergleiche: dateutil.parser.parse("01/02/2001")unddatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs
danke @jfs, guter fang. Ich habe meine Antwort entsprechend aktualisiert. (Als Nicht-Amerikaner hätte ich nicht gedacht, dass das unlogische M / D / Y-Format die Standardeinstellung für den Parser ist.)
Törzsmókus
1
Es wird nicht das Erwartete erzeugt, es 1322697600sei denn, Ihre lokale Zeitzone ist UTC. Siehe meinen Kommentar von 2014
jfs
4
Scheint ziemlich effizient zu sein:
import datetime
day, month, year ='01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 µs ± 120 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 100000 Schleifen)
Was ist die datetimeFunktion? datetimeaus der datetimeBibliothek nicht unterstützt.timestamp()
Joooeey
@Joooeey: Unter Python 3.3 oder höher . War nicht verfügbar, als die Frage gestellt wurde, aber sie ist seit September 2012 verfügbar.
ShadowRanger
0
Verwenden Sie einfach datetime.timestamp (Ihr datetime-Instanse). Die datetime-Instanz enthält die Zeitzoneninformationen, sodass der Zeitstempel ein Standard-utc-Zeitstempel ist. Wenn Sie die Datums- und Uhrzeitangabe in Zeitplan umwandeln, verliert sie ihre Zeitzone, sodass das Ergebnis ein Fehler ist. Wenn Sie eine Schnittstelle bereitstellen möchten, sollten Sie wie folgt schreiben: int (datetime.timestamp (time_instance)) * 1000
Über diesen folgenden Link können Sie die strptimeFunktion von verwenden datetime.datetime, um das Datum aus einem beliebigen Format zusammen mit der Zeitzone zu konvertieren.
my_date ='2020/08/08'
my_date = my_date.replace('/','-')# just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
Antworten:
quelle
calendar.timegm()
oder.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
ist etwas kürzer.timestamp()
geht von einer Ortszeit anstelle von UTC aus, wenn keine explizite Zeitzone angegeben ist. Der Code in der Antwort funktioniert (erzeugt erwartet1322697600
) nur auf einem Computer, auf dem die lokale Zeitzone keinen UTC-Offset hat.Ich benutze
ciso8601
, was 62x schneller ist als die Strptime von datetime.Sie können erfahren Sie mehr hier .
quelle
So konvertieren Sie die Zeichenfolge in ein Datumsobjekt:
Die Art und Weise, wie das Datumsobjekt in einen POSIX-Zeitstempel konvertiert wird, hängt von der Zeitzone ab. Von der Konvertierung
datetime.date
zum UTC-Zeitstempel in Python :Das Datumsobjekt steht für Mitternacht in UTC
Das Datumsobjekt repräsentiert Mitternacht in der Ortszeit
Die Zeitstempel sind unterschiedlich, es sei denn, Mitternacht in UTC und in der Ortszeit ist dieselbe Zeitinstanz.
quelle
NameError: name 'wckCalendar' is not defined
. Ich führe Python 3.4.1 auf einem Windows 32-Bit-Computer aus. Irgendeine Idee? Vielen Dank.quelle
"%s"
wird von Python nicht unterstützt . Es ist nicht tragbar.Die Antwort hängt auch von Ihrer Zeitzone für das Eingabedatum ab. Wenn Ihr Datum ein lokales Datum ist, können Sie mktime () verwenden, wie katrielalex sagte - nur ich verstehe nicht, warum er datetime anstelle dieser kürzeren Version verwendet hat:
Beachten Sie jedoch, dass mein Ergebnis anders ist als sein, da ich mich wahrscheinlich in einer anderen TZ befinde (und das Ergebnis ein zeitzonenfreier UNIX-Zeitstempel ist).
Wenn das Eingabedatum bereits in UTC liegt, ist meiner Meinung nach die richtige Lösung:
quelle
Verwenden Sie einfach
datetime.datetime.strptime
:Ergebnis:
Um UTC anstelle der lokalen Zeitzone zu verwenden, verwenden Sie
.replace
:quelle
float
nichtint
Zuerst müssen Sie die Klasse strptime verwenden , um die Zeichenfolge in ein struct_time-Format zu konvertieren.
Verwenden Sie dann einfach mktime von dort, um Ihren Float zu erhalten.
quelle
Viele dieser Antworten denken nicht daran, dass das Datum zunächst naiv ist
Um korrekt zu sein, müssen Sie zuerst das naive Datum als zeitzonenabhängige Datums- / Uhrzeitangabe festlegen
Ebenfalls:
Seien Sie vorsichtig und verwenden Sie
pytz
fortzinfo
in einerdatetime.datetime
Funktion, die für viele Zeitzonen NICHT funktioniert. Siehe Datum / Uhrzeit mit Pytz-Zeitzone. Unterschiedlicher Versatz je nachdem, wie tzinfo eingestellt isthttps://en.wikipedia.org/wiki/Local_mean_time
quelle
Ich würde dateutil vorschlagen :
quelle
"%d/%m/%Y"
Format. Vergleiche:dateutil.parser.parse("01/02/2001")
unddatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
sei denn, Ihre lokale Zeitzone ist UTC. Siehe meinen Kommentar von 2014Scheint ziemlich effizient zu sein:
1,61 µs ± 120 ns pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 100000 Schleifen)
quelle
datetime
Funktion?datetime
aus derdatetime
Bibliothek nicht unterstützt.timestamp()
Verwenden Sie einfach datetime.timestamp (Ihr datetime-Instanse). Die datetime-Instanz enthält die Zeitzoneninformationen, sodass der Zeitstempel ein Standard-utc-Zeitstempel ist. Wenn Sie die Datums- und Uhrzeitangabe in Zeitplan umwandeln, verliert sie ihre Zeitzone, sodass das Ergebnis ein Fehler ist. Wenn Sie eine Schnittstelle bereitstellen möchten, sollten Sie wie folgt schreiben: int (datetime.timestamp (time_instance)) * 1000
quelle
Über diesen folgenden Link können Sie die
strptime
Funktion von verwendendatetime.datetime
, um das Datum aus einem beliebigen Format zusammen mit der Zeitzone zu konvertieren.https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
quelle
Sie können in Isoformat konvertieren
quelle
Eine einfache Funktion zum Abrufen der UNIX-Epochenzeit.
HINWEIS : Diese Funktion setzt voraus, dass das eingegebene Datum im UTC-Format vorliegt (siehe Kommentare hier).
Verwendung :
quelle