cadena a datetime con segundos fraccionarios, en Google App Engine

Necesito convertir una cadena en un objeto de fecha y hora, junto con los segundos fraccionarios. Estoy teniendo varios problemas.

Normalmente, yo haría:

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

Pero los errores y los documentos antiguos me mostraron que el tiempo de ejecución de python2.5 no tiene% f …

Investigando más a fondo, parece que al almacén de datos de App Engine no le gustan los segundos fraccionarios. Al editar una entidad del almacén de datos, al intentar agregar .5 en el campo de fecha y hora se produjo el siguiente error:

 ValueError: unconverted data remains: .5 

Dudo que los segundos fraccionarios no sean compatibles … así que esto es solo en el visor del almacén de datos, ¿verdad?

¿Alguien ha evitado este problema? Quiero usar los objetos de fecha y hora nativos … Prefiero no almacenar las marcas de tiempo de UNIX …

¡Gracias!


EDITAR: Gracias a Jacob Oscarson por la sugerencia .replace (…)!

Una cosa a tener en cuenta es verificar la longitud del nofrag antes de introducirlo. Las distintas fonts utilizan una precisión diferente por segundos.

Aquí hay una función rápida para aquellos que buscan algo similar:

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

Análisis

Sin el soporte de formato %f para datetime.datetime.strptime() , aún puede ingresar con suficiente facilidad en un objeto datetime.datetime (seleccionando al azar un valor para su valor de valor aquí) usando datetime.datetime.replace() ), probado en 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) 

Ahora tienes tu objeto datetime.datetime .

Almacenamiento

Leer más en http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime

No veo ninguna mención de que las fracciones no sean compatibles, así que sí, es probable que solo sea el visor del almacén de datos. La documentación apunta directamente a la documentación del módulo de Python 2.5.2 para datetime y admite fracciones, pero no la directiva de análisis %f para strptime . Sin embargo, la consulta de fracciones podría ser más complicada.

Toda la historia antigua hasta ahora, pero en estos tiempos modernos también puede usar convenientemente dateutil

 from dateutil import parser as DUp funky_time_str = "1/1/2011 12:51:00.0123 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.012300 

dateutil admite una sorprendente variedad de formatos de entrada posibles, que analiza sin cadenas de patrones.