2014-12-02 40 views
11

Próbuję dodać dwa razy razem. Znacznik czasu ISO   8601 to "1984-06-02T19: 05: 00.000Z", a ja chciałbym przekonwertować go na sekundy. Próbowałem używać modułu Python iso8601, ale jest to tylko analizator składni.Konwertowanie daty daty ISO 8601 na sekundy w języku Python

Wszelkie sugestie?

+0

Co sekund? Sekundy od epoki? –

+0

Chyba tak. To jest mój pierwszy kontakt z datami. –

+0

pokrewne: [Konwertuj czas RFC 3339 na standardowy znacznik czasu Pythona] (http://stackoverflow.com/q/1941927/4279) – jfs

Odpowiedz

9

Jeśli chcesz uzyskać sekund od epoki, można użyć python-dateutil przekonwertować go do datetime obiektu, a następnie przekształcić go tak sekund stosując metodę strftime. Tak:

>>> 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' 

Więc byliśmy w połowie drogi :)

+0

Dzięki feynman21. Zajmuję się dokumentacją dateutil.parser. Co jeśli chcę go przekonwertować z powrotem do formatu ISO. –

+1

sprawdź [to] (https://docs.python.org/2/library/datetime.html). 'datetime.isoformat()' powinien mieć to, czego szukasz. Powinieneś najpierw przekonwertować ciąg z powrotem na obiekt 'datetime' używając' strptime', a następnie wywołać 'isoformat' na tym obiekcie. – hopla

+0

http://stackoverflow.com/questions/3401428/how-to-get-an-isoformat-datetime-string-include-the-default-timezone Bardzo dziękuję za pomoc. –

7

Twoja data jest czas UTC w RFC 3339 format, można je analizować przy użyciu tylko stdlib:

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 

Zobacz także Converting datetime.date to UTC timestamp in Python

Jak przekonwertować go z powrotem na format ISO 8601?

Aby przekonwertować POSIX znacznik czasu z powrotem, należy utworzyć obiekt UTC datetime od niego, i sformatować go przy użyciu .strftime() metody:

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 

Uwaga: Drukuje sześć cyfr po przecinku (mikrosekundy). Aby uzyskać trzy cyfry, zobacz .

+0

Czy wiesz jak to zrobić z powrotem do formatu ISO 8601? Do tej pory anotherTime = datetime.datetime.fromtimestamp (timestamp) .isoformat(), ale formatuje .000Z. Jakieś sugestie?Próbowałem wielu rzeczy, ale dostałem tylko błędy: –

+0

@ user3426338: Zaktualizowałem odpowiedź, aby przekonwertować sygnaturę czasową (numer) z powrotem na ciąg znaków w formacie ISO 8601. – jfs

+0

dzięki za pomoc. –

-1

Oto rozwiązanie w Pythonie 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

Imponująco krótki czysty stdlib TZ-aware parsing! Niestety, nie jest to format ISO 8601 (patrz przykład lub uruchom 'date --iso-8601 = ns'). Standard ISO dopuszcza * tony * formatów, więc strptime jest beznadziejny, ale parsowanie tylko '± hh: mm',' Z' formatów stref czasowych (podzbiór RFC3339) byłoby w wielu przypadkach wystarczająco dobre. –