2010-08-04 9 views
11

Konieczne jest przekonwertowanie ciągu na obiekt typu datetime wraz z ułamkowymi sekundami. Występują różne problemy.Łańcuch do datetime z ułamkowymi sekundami, w Google App Engine

Normalnie zrobiłbym:

>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f") 

Ale błędy i stare docs pokazał mi strptime tego python2.5 za nie posiada% f ...

Badając dalej, wydaje się, że na App Engine magazyn danych nie lubi ułamków sekund. Po edycji podmiot magazynu danych, starając się dodać .5 pola datetime dał mi następujący błąd:

ValueError: unconverted data remains: .5 

wątpię, że ułamków sekund nie są obsługiwane ... więc to tylko na widza magazynu danych, prawda?

Czy ktoś omijał ten problem? Chcę używać natywnych obiektów datetime ... Raczej nie zapisuję znaczników czasu UNIX ...

Dzięki!


EDYCJA: Dzięki Jacobowi Oscarsonowi za końcówkę .replace (...)!

Należy pamiętać o sprawdzeniu długości nofrag przed jej wprowadzeniem. Różne źródła używają różnej dokładności przez kilka sekund.

Oto krótki funkcja dla tych, którzy szukają czegoś podobnego:

def strptime(val): 
    if '.' not in val: 
     return datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S") 

    nofrag, frag = val.split(".") 
    date = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S") 

    frag = frag[:6] # truncate to microseconds 
    frag += (6 - len(frag)) * '0' # add 0s 
    return date.replace(microsecond=int(frag)) 
+0

Dzięki! Naprawdę szukałem czegoś podobnego. =) – PEZ

Odpowiedz

11

parsowania

Bez wsparcia formatu %f dla datetime.datetime.strptime() można jeszcze wystarczająco proste wpisanie go w datetime.datetime obiektu (losowo picking wartość dla twojego val tutaj) przy użyciu datetime.datetime.replace()), testowana na 2.5.5:

>>> val = '2010-08-06T10:00:14.143896' 
>>> nofrag, frag = val.split('.') 
>>> nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S") 
>>> dt = nofrag_dt.replace(microsecond=int(frag)) 
>>> dt 
datetime.datetime(2010, 8, 6, 10, 0, 14, 143896) 

Teraz masz swój obiekt datetime.datetime.

Przechowywanie

Czytając dalej do http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime

widzę nie wspomnieć, że frakcje nie jest obsługiwany, tak tak, to chyba tylko widz magazyn danych. Dokumenty wskazują bezpośrednio na dokumenty modułu Python 2.5.2 dla datetime i obsługują ułamki, a nie dyrektywę analizowania %f dla . Odpytywanie dla frakcji może być trudniejsze, choć ..

+0

Dzięki za odpowiedź!Właściwie, wysyłanie zapytań za pomocą ułamków wydaje się działać dobrze. Zrobiłem kilka szybkich testów i zdecydowanie wskazuje różnicę między milisekundami. – jbenet

2

Wszystko już stara historia, ale w tych czasach nowożytnych można także wygodnie korzystać dateutil

from dateutil import parser as DUp 

funky_time_str = "1/1/2011 12:51:00.AM" 

foo = DUp.parse(funky_time_str) 

print foo.timetuple() 
# time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=51, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1) 

print foo.microsecond 
# 12300 

print foo 
# 2011-01-01 00:51:00.

dateutil obsługuje zaskakującą różnorodność możliwych formatów wejściowych, które go analizuje bez ciągów wzorów.

+2

* "w tych czasach współczesnych" *, 'datetime.strptime (val,"% Y-% m-% dT% H:% M:% S.% f ")' działa tak jak jest. – jfs