Wie konvertiere ich eine Zeichenfolge im Format "%d/%m/%Y"
in einen Zeitstempel?
"01/12/2011" -> 1322697600
Wie konvertiere ich eine Zeichenfolge im Format "%d/%m/%Y"
in einen Zeitstempel?
"01/12/2011" -> 1322697600
Antworten:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
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 erwartet 1322697600
) 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.
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 .
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.date
zum 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.
NameError: name 'wckCalendar' is not defined
. Ich führe Python 3.4.1 auf einem Windows 32-Bit-Computer aus. Irgendeine Idee? Vielen Dank.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%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:
>>> 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
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()
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.
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 pytz
for tzinfo
in einer datetime.datetime
Funktion, 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
Ich würde dateutil vorschlagen :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%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 2014
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)
datetime
Funktion? datetime
aus der datetime
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
Über diesen folgenden Link können Sie die strptime
Funktion von verwenden datetime.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
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()
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