Mam plik zrzutu CSV z kopii zapasowej telefonu Blackberry IPD, utworzony za pomocą IPDDump. Ciągi daty / czasu tutaj wyglądają mniej więcej tak (gdzie EST
jest australijska strefa czasowa):
Tue Jun 22 07:46:22 EST 2010
Muszę móc przeanalizować tę datę w Pythonie. Na początku próbowałem użyć strptime()
funkcji z datettime.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Jednak z jakiegoś powodu datetime
obiekt, który wraca, nie wydaje się być tzinfo
z nim powiązany.
Czytałem na tej stronie , że pozornie datetime.strptime
cicho usuwa tzinfo
jednak sprawdziłem dokumentację, i nie mogę znaleźć nic w tym zakresie udokumentowane tutaj .
Udało mi się uzyskać analizę daty za pomocą biblioteki Python innej firmy, dateutil , ale nadal jestem ciekawy, w jaki sposób strptime()
nieprawidłowo korzystałem z wbudowanej biblioteki ? Czy jest jakiś sposób, aby strptime()
ładnie bawić się strefami czasowymi?
Odpowiedzi:
Dokumentacja
datetime
modułu mówi:Widzisz to
[0:6]
? To cię dostaje(year, month, day, hour, minute, second)
. Nic więcej. Brak wzmianki o strefach czasowych.Co ciekawe, [Win XP SP2, Python 2.6, 2.7] przekazanie twojego przykładu do
time.strptime
nie działa, ale jeśli usuniesz „% Z” i „EST”, to zadziała. Działa również używanie „UTC” lub „GMT” zamiast „EST”. „PST” i „MEZ” nie działają. Zagadkowe.Warto zauważyć, że zostało to zaktualizowane w wersji 3.2, a ta sama dokumentacja zawiera teraz również następujące informacje:
Zauważ, że to nie działa z% Z, więc wielkość liter jest ważna. Zobacz poniższy przykład:
źródło
Polecam używanie python-dateutil . Jego parser był w stanie przeanalizować każdy format daty, jaki do tej pory użyłem.
i tak dalej. Nie ma
strptime()
sensu zajmować się formatowaniem ... po prostu rzuć na to randkę i zrobi to dobrze.Aktualizacja : Ups. Brakowało mi w twoim pierwotnym pytaniu, o którym wspomniałeś
dateutil
, przepraszam za to. Mam jednak nadzieję, że ta odpowiedź jest nadal przydatna dla innych osób, które natkną się na to pytanie, gdy mają pytania dotyczące analizy daty i widzą użyteczność tego modułu.źródło
>>> 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")
zwraca:datetime.datetime(2016, 10, 27, 9, 6)
niedateutil parser
może być prosty w użyciu, alestrptime()
jest szybszy. Poza tym jego formaty są dość łatwe do nauczenia.Twój ciąg czasu jest podobny do formatu czasu w rfc 2822 (format daty w wiadomości e-mail, nagłówki http) . Możesz go przeanalizować używając tylko standardowej biblioteki:
Zobacz rozwiązania, które zapewniają obiekty daty i godziny uwzględniające strefę czasową dla różnych wersji Pythona: analizowanie daty ze strefą czasową z wiadomości e-mail .
W tym formacie
EST
jest semantycznie równoważny z-0500
. Chociaż, ogólnie rzecz biorąc, skrót strefy czasowej nie wystarczy, aby jednoznacznie zidentyfikować strefę czasową .źródło
Wpadłem na dokładnie ten problem.
Co ostatecznie zrobiłem:
źródło