2012-05-08 37 views
34

Mam ciąg daty, którego nie potrafię przetworzyć w języku Python.Łańcuch czasu analizy w języku Python

Łańcuch jest tak:

Tue May 08 15:14:45 +0800 2012 

Próbowałem

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y") 

ale Python podnosi

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y' 

Według Python doc:

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).

Jaki format jest odpowiedni do analizowania tego łańcucha czasu?

+0

related: [Python: parsowanie data ze strefą czasową z wiadomości e-mail] (http://stackoverflow.com/q/1790795/4279) – jfs

Odpowiedz

55

datetime.datetime.strptime ma problemy z parsowania stref czasowych. Wystarczy popatrzeć na dateutil package:

>>> from dateutil import parser 
>>> parser.parse("Tue May 08 15:14:45 +0800 2012") 
datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800)) 
+0

wszelkie pomysły dotyczące analizowania" 02/Nov/2012: 06: 37: 42 + 0000 "? Jest to format używany przez nginx w plikach dziennika, a 'parser.parse' zwraca' ValueError: unknown string format'. – zidarsk8

+0

@ zidarsk8: Najpierw musisz usunąć dwukropek po dacie: '' 'parser.parse (" 06/Apr/2014: 13: 23: 04 ".replace (": "," ", 1))' ' ' –

+8

@ zidarsk8 spróbuj tego:' parser.parse ("02/Nov/2012: 06: 37: 42 +0000", fuzzy = True) '- określając fuzzy, parser ignoruje znaki, których nie rozumie. – drevicko

1
In [117]: datetime.datetime.strptime? 
Type:   builtin_function_or_method 
Base Class:  <type 'builtin_function_or_method'> 
String Form: <built-in method strptime of type object at 0x9a2520> 
Namespace:  Interactive 
Docstring: 
    string, format -> new datetime parsed from a string (like time.strptime()). 
+1

Próbowałem 'datetime.strptime (" wt. 08 15:14:45 +0800 2012 ","% a% b% d% H:% M:% S% z% Y ")', ale Python podnosi '' z 'to kiepska dyrektywa w formacie'% a% b% d% H:% M:% S% z% Y ' ' – xiaohan2012

13

Najprościej jest, aby spojrzeć na strptime()

coś wzdłuż linii

>>> from datetime import datetime 
>>> date_str = 'Tue May 08 15:14:45 +0800 2012' 
>>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y') 
>>> date 
datetime.datetime(2012, 5, 8, 15, 14, 45) 

nie jestem pewien jak to zrobić strefę czasową +0800 niestety, może ktoś inny może pomóc z tym.

Ciągi formatowania można znaleźć pod numerem http://docs.python.org/library/time.html#time.strftime i są takie same dla formatowania ciągu znaków do drukowania.

nadzieję, że pomoże

Mark

PS, najlepiej dla stref czasowych w instalacji pytz z PyPI. (http://pytz.sourceforge.net/) w rzeczywistości Myślę, że Python ma wielką metodę parsowania datetime, jeśli dobrze pamiętam. Standardowa biblioteka jest trochę cienka na ziemi dzięki funkcji strefy czasowej.

+0

eumiro wspomina o 'datetime.datetime.strptime' ma problemy z parsowaniem strefy czasowej. Myślę, że to prawda – xiaohan2012

3

Omówiono wiele razy w SO. W skrócie, "% z" nie jest obsługiwany, ponieważ platforma go nie obsługuje. Moje rozwiązanie jest nowa, po prostu pominąć strefę czasową .:

datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y") 
3

Oto rozwiązanie stdlib który obsługuje zmienną przesunięcie UTC w ciągu czasu wejścia:

>>> from email.utils import parsedate_tz, mktime_tz 
>>> from datetime import datetime, timedelta 
>>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012')) 
>>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp) 
>>> utc_time 
datetime.datetime(2012, 5, 8, 7, 14, 45)