Konvertieren Sie das String-Datum in Python in einen Zeitstempel

219

Wie konvertiere ich eine Zeichenfolge im Format "%d/%m/%Y"in einen Zeitstempel?

"01/12/2011" -> 1322697600
Shankar Cabus
quelle
Was ist die 2. Nummer? Unix-Epoche?
Hasteur
4
@ 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
Katriel
quelle
10
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'
Zdenek Maxa
5
@ZdenekMaxa datetime.timestamp () nur für Python> = 3.3-Versionen verfügbar. docs.python.org/3/whatsnew/3.3.html
Joni Jones
48

Ich benutze ciso8601, was 62x schneller ist als die Strptime von datetime.

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

Sie können erfahren Sie mehr hier .

Eyal Ch
quelle
2
Das ist ein fantastischer Vorschlag. Ich habe es gerade benutzt und Tonnen von Zeit von meiner Hinrichtung rasiert.
David
3
Mein Gott, das ist schnell
Hews
3
Und +1, weil ich das Zeitzeichenfolgenformat nicht buchstabieren muss.
Gowenfawr
40

So konvertieren Sie die Zeichenfolge in ein Datumsobjekt:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

Die Art und Weise, wie das Datumsobjekt in einen POSIX-Zeitstempel konvertiert wird, hängt von der Zeitzone ab. Von der Konvertierung datetime.datezum UTC-Zeitstempel in Python :

  • Das Datumsobjekt steht für Mitternacht in UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • Das Datumsobjekt repräsentiert Mitternacht in der Ortszeit

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

Die Zeitstempel sind unterschiedlich, es sei denn, Mitternacht in UTC und in der Ortszeit ist dieselbe Zeitinstanz.

jfs
quelle
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.
JFS
30
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
San4ez
quelle
10
"%s"wird von Python nicht unterstützt . Es ist nicht tragbar.
JFS
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:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

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:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Nowakus
quelle
Ich denke das ist besser. Es ist nicht erforderlich, sowohl 'time' als auch 'datetime' zu importieren.
Kennyut
17

Verwenden Sie einfach datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

Ergebnis:

1322697600

Um UTC anstelle der lokalen Zeitzone zu verwenden, verwenden Sie .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
nm111
quelle
Für eine vollständige Antwort müssen Sie sagen, dass sie nur für Python 3.3+ gültig ist
Eduardo
Im ersten Beispiel ist das Ergebnis ein floatnichtint
CONvid19
6

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.

Kryptit
quelle
6

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

Ebenfalls:

Seien Sie vorsichtig und verwenden Sie pytzfor tzinfoin einer datetime.datetimeFunktion, die für viele Zeitzonen NICHT funktioniert. Siehe Datum / Uhrzeit mit Pytz-Zeitzone. Unterschiedlicher Versatz je nachdem, wie tzinfo eingestellt ist

# 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

https://en.wikipedia.org/wiki/Local_mean_time

MrE
quelle
6

Ich würde dateutil vorschlagen :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
törzsmókus
quelle
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)

Gerard
quelle
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

user6689187
quelle
0

Sie können in Isoformat 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()
Aliens Dev
quelle
-1

Eine einfache Funktion zum Abrufen der UNIX-Epochenzeit.

HINWEIS : Diese Funktion setzt voraus, dass das eingegebene Datum im UTC-Format vorliegt (siehe Kommentare hier).

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

Verwendung :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
Gihanchanuka
quelle