2014-12-02 8 views
11

Ich versuche, zwei mal zusammen zu addieren. Der Zeitstempel ISO   8601 ist '1984-06-02T19: 05: 00.000Z' und ich möchte ihn in Sekunden umwandeln. Ich habe versucht, das Python-Modul iso8601 zu verwenden, aber es ist nur ein Parser.Konvertieren von ISO 8601 Datum Zeit in Sekunden in Python

Irgendwelche Vorschläge?

+0

Welche Sekunden? Sekunden seit der Epoche? –

+0

Ich denke schon. Dies ist das erste Mal, dass ich mit Daten arbeite. –

+0

bezogen werden: [Konvertieren eine RFC 3339 Zeit zu einem Standard-Python-Zeitstempel] (http://stackoverflow.com/q/1941927/4279) – jfs

Antwort

9

Wenn Sie die Sekunden seit der Epoche erhalten möchten, können Sie python-dateutil verwenden, um es in ein datetime Objekt zu konvertieren und es dann so Sekunden unter Verwendung der strftime Methode zu konvertieren. Wie so:

>>> import dateutil.parser as dp 
>>> t = '1984-06-02T19:05:00.000Z' 
>>> parsed_t = dp.parse(t) 
>>> t_in_seconds = parsed_t.strftime('%s') 
>>> t_in_seconds 
'455047500' 

Sie waren also auf halbem Weg dort :)

+0

Dank feynman21. Ich schaue mir die dateutil.parser Dokumentation an. Was, wenn ich es wieder in ein ISO-Format konvertieren möchte. –

+1

check [this] (https://docs.python.org/2/library/datetime.html) aus. 'datetime.isoformat()' sollte das haben, wonach Sie suchen. Sie sollten also zuerst die Zeichenkette mit 'strptime' zurück in ein' datetime' Objekt konvertieren und dann 'isoformat' für dieses Objekt aufrufen. – hopla

+0

http://stackoverflow.com/questions/3401428/how-to-get-an-isoformat-datetime-string-including-the-default-timezone Vielen Dank für Ihre Hilfe. –

7

Ihr Datum in RFC 3339 format UTC-Zeit ist, könnten Sie es analysieren nur stdlib mit:

from datetime import datetime 

utc_dt = datetime.strptime('1984-06-02T19:05:00.000Z', '%Y-%m-%dT%H:%M:%S.%fZ') 

# Convert UTC datetime to seconds since the Epoch 
timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds() 
# -> 455051100.0 

Siehe auch Converting datetime.date to UTC timestamp in Python

Wie kann ich es zurück in das ISO 8601-Format konvertieren?

Um POSIX-Zeitstempel zurück zu konvertieren, ein UTC Datetime-Objekt von ihm erstellen und formatieren Sie es .strftime() Methode:

from datetime import datetime, timedelta 

utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp) 
print(utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ')) 
# -> 1984-06-02T19:05:00.000000Z 

Hinweis: Er druckt sechs Stellen nach dem Komma (Mikrosekunden). Um drei Ziffern zu erhalten, siehe Formatting microseconds to 2 decimal places (in fact converting microseconds into tens of microseconds).

+0

Haben Sie durch Zufall, wie es zu ISO 8601-Format zu konvertieren zurück? So weit anotherTime = datetime.datetime.fromtimestamp (timestamp) .isoformat() aber formt .000Z. Irgendwelche Vorschläge?Ich habe mehrere Dinge ausprobiert, aber alles, was ich bekam, waren Fehler –

+0

@ user3426338: Ich habe die Antwort aktualisiert, um zu zeigen, wie man den Zeitstempel (Nummer) zurück in die ISO 8601-Formatzeichenfolge konvertiert. – jfs

+0

danke für Ihre Hilfe. –

-1

Hier ist eine Lösung in Python 3:

$ date +%s 
1428030452 
$ TZ=US/Pacific date -d @1428030452 '+%Y%m%d %H:%M:%S %z' 
20150402 20:07:32 -0700 
$ TZ=US/Eastern date -d @1428030452 '+%Y%m%d %H:%M:%S %z' 
20150402 23:07:32 -0400 
$ python3 
>>> from datetime import datetime,timezone 
>>> def iso2epoch(ts): 
...  return int(datetime.strptime(ts[:-6],"%Y%m%d %H:%M:%S").replace(tzinfo=timezone.utc).timestamp()) - (int(ts[-2:])*60 + 60 * 60 * int(ts[-4:-2]) * int(ts[-5:-4]+'1')) 
... 
>>> iso2epoch("20150402 20:07:32 -0700") 
1428030452 
>>> iso2epoch("20150402 23:07:32 -0400") 
1428030452 
>>> 
+0

Beeindruckend kurzes reines stdlib TZ-sensitives Parsing! Leider ist es nicht ISO 8601-Format (siehe Beispiel in Frage oder führen Sie "Datum - ISO-8601 = NS"). Der ISO-Standard erlaubt * Tonnen * von Formaten, so dass die Wartezeit hoffnungslos ist, aber das Parsen nur von "± hh: mm", "Z" Zeitzonenformaten (die RFC3339-Untermenge) wäre in vielen Fällen gut genug. –

Verwandte Themen