2010-08-04 11 views
11

Ho bisogno di convertire una stringa in un oggetto datetime, insieme ai secondi frazionari. Sto incontrando vari problemi.stringa a datetime con secondi frazionari, su Google App Engine

Normalmente, vorrei fare:

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

Ma gli errori e vecchi documenti mi ha mostrato che strptime di python2.5 non ha% f ...

Indagare ulteriormente, sembra che l'App Engine all'archivio dati non piacciono i secondi frazionari. Al momento la modifica di un'entità archivio dati, provando ad aggiungere 0,5 al campo datetime mi ha dato il seguente errore:

ValueError: unconverted data remains: .5 

dubito che frazioni di secondo non sono supportati ... quindi questo è solo sul visore datastore, giusto?

Qualcuno ha aggirato questo problema? Voglio utilizzare gli oggetti datetime nativi ... Preferisco non memorizzare i timestamp UNIX ...

Grazie!


MODIFICA: Grazie a Jacob Oscarson per il suggerimento .replace (...)!

Una cosa da tenere a mente è controllare la lunghezza di nofrag prima di inserirla. Diverse fonti usano una precisione diversa per secondi.

Ecco un rapido funzione per chi cerca qualcosa di simile:

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

Grazie! Stavo davvero cercando qualcosa di simile. =) – PEZ

risposta

11

di analisi

Senza il supporto per il formato %f per datetime.datetime.strptime() si può ancora sufficientemente facile entrare in un oggetto datetime.datetime (in modo casuale raccolta un valore per il tuo val qui) usando datetime.datetime.replace()), testato su 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) 

Ora hai l'oggetto datetime.datetime.

Memorizzazione

Lettura ulteriormente in http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime

non vedo ricordare che le frazioni non è supportato, quindi sì, è probabilmente solo lo spettatore datastore. Il documento punta direttamente ai documenti del modulo di Python 2.5.2 per datetime e supporta le frazioni, ma non solo la direttiva di parsing %f per strptime. Interrogazione per frazioni potrebbe essere più complicato, anche se ..

+0

Grazie per la risposta!In realtà, l'interrogazione con le frazioni sembra funzionare correttamente. Ho fatto un paio di test rapidi e sicuramente indica la differenza tra millisecondi. – jbenet

2

Tutti storia antica, ormai, ma in questi tempi moderni si può anche comodamente utilizzare 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 supporta una sorprendente varietà di possibili formati di input, che analizza senza stringhe di pattern.

+2

* "in questi tempi moderni" *, 'datetime.strptime (val,"% Y-% m-% dT% H:% M:% S.% f ")' funziona così com'è. – jfs