Ich habe ein CSV-Dumpfile aus einem Blackberry IPD-Backup, das mit IPDDump erstellt wurde. Die Datums- / Zeitzeichenfolgen hier sehen ungefähr so aus (wo EST
sich eine australische Zeitzone befindet):
Tue Jun 22 07:46:22 EST 2010
Ich muss in der Lage sein, dieses Datum in Python zu analysieren. Zuerst habe ich versucht, die strptime()
Funktion von datettime zu verwenden.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Aus irgendeinem Grund datetime
scheint dem zurückkommenden Objekt jedoch nichts zugeordnet zu sein tzinfo
.
Ich habe auf dieser Seite gelesen, dass anscheinend datetime.strptime
stillschweigend verworfen tzinfo
wird. Ich habe jedoch die Dokumentation überprüft und kann hier nichts Dokumentiertes finden .
Ich konnte das Datum mithilfe einer Python-Bibliothek eines Drittanbieters, dateutil , analysieren . Ich bin jedoch immer noch neugierig, wie ich das eingebaute Datum strptime()
falsch verwendet habe. Gibt es eine Möglichkeit, strptime()
gut mit Zeitzonen zu spielen?
Antworten:
Die
datetime
Moduldokumentation lautet:Sehen Sie das
[0:6]
? Das bringt dich(year, month, day, hour, minute, second)
. Nichts anderes. Keine Erwähnung von Zeitzonen.Interessanterweise
time.strptime
funktioniert [Win XP SP2, Python 2.6, 2.7] , wenn Sie Ihr Beispiel an übergeben , nicht, aber wenn Sie "% Z" und "EST" entfernen, funktioniert es. Auch die Verwendung von "UTC" oder "GMT" anstelle von "EST" funktioniert. "PST" und "MEZ" funktionieren nicht. Rätselhaft.Es ist erwähnenswert, dass dies ab Version 3.2 aktualisiert wurde und in derselben Dokumentation nun auch Folgendes angegeben ist:
Beachten Sie, dass dies mit% Z nicht funktioniert, daher ist der Fall wichtig. Siehe folgendes Beispiel:
quelle
Ich empfehle die Verwendung von Python-Dateutil . Der Parser konnte jedes Datumsformat analysieren, das ich bisher verwendet habe.
und so weiter. Kein Umgang mit
strptime()
Format-Unsinn ... werfen Sie einfach ein Datum darauf und es macht das Richtige.Update : Ups. Ich habe in Ihrer ursprünglichen Frage übersehen, dass Sie erwähnt haben, dass Sie verwendet haben
dateutil
, tut mir leid. Ich hoffe jedoch, dass diese Antwort für andere Personen nützlich ist, die über diese Frage stolpern, wenn sie Fragen zur Datumsanalyse haben und die Nützlichkeit dieses Moduls erkennen.quelle
>>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
parser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
dateutil.parser.parse("10-27-2016 09:06 AM PDT")
Rückkehr:datetime.datetime(2016, 10, 27, 9, 6)
Zeitzone nicht herausgefunden ...dateutil parser
mag einfach zu bedienen sein, ist aberstrptime()
schneller. Außerdem sind seine Formate recht einfach zu erlernen.Ihre Zeitzeichenfolge ähnelt dem Zeitformat in rfc 2822 (Datumsformat in E-Mail, http-Header) . Sie können es nur mit stdlib analysieren:
Sehen Sie sich Lösungen an, die zeitzonenabhängige datetime-Objekte für verschiedene Python-Versionen liefern: Analysieren des Datums mit der Zeitzone aus einer E-Mail .
In diesem Format
EST
ist semantisch äquivalent zu-0500
. Im Allgemeinen reicht eine Zeitzonenabkürzung jedoch nicht aus, um eine Zeitzone eindeutig zu identifizieren .quelle
Bin genau auf dieses Problem gestoßen.
Was ich letztendlich gemacht habe:
quelle