Wie zu analysieren, Termine mit Zeitzone -0400 string in Python?
Ich habe ein Datum-string der form '2009/05/13 19:19:30 -0400'. Es scheint, dass die früheren Versionen von Python, kann unterstützen Sie %z-format-tag in der strptime für die nachfolgende Zeitzone Spezifikation, aber 2.6.x scheint entfernt zu haben.
Was ist die richtige Art und Weise zu analysieren, diesen string in ein datetime-Objekt?
InformationsquelleAutor fields | 2009-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mithilfe der parse-Funktion von dateutil:
Diese Weise erhalten Sie ein datetime-Objekt, das Sie dann verwenden können.
Als beantwortet, dateutil2.0 geschrieben für Python 3.0 und funktioniert nicht mit Python 2.x. Für Python 2.x dateutil1.5 verwendet werden muss.
Dies funktioniert gut für mich (
dateutil
2.1) mit Python2.7.2
; Python 3 ist nicht erforderlich. Beachten Sie, dass wenn Sie die Installation von pip, der name des Pakets istpython-dateutil
.InformationsquelleAutor txwikinger
%z
unterstützt in Python 3.2+:Auf früheren Versionen:
wo
FixedOffset
ist eine Klasse basierend auf das code Beispiel aus den docs:ValueError: 'z' is a bad directive in format '%Y-%m-%d %M:%H:%S.%f %z'
in meinem Fall (Python 2.7).es soll nicht die Arbeit auf Python 2.7-Look ganz oben die Antwort.
seltsam übrigens, dass das überhaupt NICHT erwähnt, auf Python 2.7 docs: docs.python.org/2.7/library/...
InformationsquelleAutor jfs
Hier ist ein fix der
"%z"
Problem für Python 2.7 und früherenAnstelle von:
Verwenden Sie die
timedelta
zu berücksichtigen, für die Zeitzone, wie diese:Beachten Sie, dass die Daten umgewandelt werden würde, um
GMT
, die es erlauben würde, Datumsberechnungen, ohne sich Gedanken über Zeitzonen.danke @Dave, es behoben
das entspricht GMT... wenn es das ist, was Sie wirklich wollen...
Nur als Anmerkung, wenn Sie wollte eine Zeitzone in einen string konvertieren und die datetime in UTC, würde die gegenüber der Logik hier aufgelistet. Wenn die Zeitzone +, subtrahieren Sie die timedelta-und Umgekehrt.
Die Umwandlung der UTC-war falsch, wenn es eine
+
Charakter der timedelta sollte abgezogen, und Umgekehrt. Ich habe editiert und korrigiert den code.InformationsquelleAutor Uri Goren
Das problem bei der Verwendung dateutil ist, dass Sie können nicht die gleichen format-string für die Serialisierung und Deserialisierung, wie dateutil hat eine begrenzte Formatierung Optionen (nur
dayfirst
undyearfirst
).In meiner Anwendung speichern, das format string .INI-Datei, und jede Implementierung kann ein eigenes format. Also, ich weiß wirklich nicht, wie die dateutil-Ansatz.
Hier ist eine alternative Methode, die verwendet pytz statt:
InformationsquelleAutor sayap
One-liner für die alten Pythons gibt. Sie können multiplizieren eine timedelta durch 1/-1, je nach Vorzeichen, in:
InformationsquelleAutor Eric Sellin
Wenn Sie auf Linux sind, dann können Sie das externe
date
Befehl dwim:Dies ist natürlich weniger tragbar als dateutil ist, aber etwas flexibler, da
date
akzeptiert auch Eingaben wie "gestern" oder "letztes Jahr" 🙂Es hängt alles vom Kontext ab: wenn das, was wir suchen, ist nur eine schreiben-und-Wegwerf-Skript, dann werden diese Schwachstellen sind nur irrelevant 🙂
Down-voting das, weil: 1) Es macht einen system-Aufruf für etwas trivial, 2) Es injiziert strings direkt in einer shell aufrufen, 3) Aufrufe von eval(), und 4) Es hat eine Ausnahme catch-all. Im Grunde ist dies ein Beispiel, wie nicht, Dinge zu tun.
vereinbarten @benjaoming!
Gut, wieder, dieses "eval is evil" - motto hängt wirklich davon ab, Ihren Kontext (die nicht bereits von der OP). Wenn ich Skripte schreiben, die für meinen eigenen Gebrauch, ich benutze eval liberal, und es ist genial. Python ist eine tolle Sprache für Klebstoff-Skripte ! Natürlich können Sie roll-out gewundenen general-case-over-engineered-Lösungen wie in einigen Antworten oben, und dann behaupten, es ist-der-einzige-richtige-Weg-zu-tun-ist es, ala Java. Aber für viele Anwendungsfälle eine quick-and-dirty-Lösung ist nur so gut.
InformationsquelleAutor Gyom