2009-02-10 9 views
14

que tienen un archivo de texto con una gran cantidad de cadenas de fecha y hora en isoformat. Las cuerdas son similares a esto:cadenas de fecha y hora al analizar con microsegundos

'2009-02-10 16: 06: 52.598800'

Estas cadenas se generaron utilizando str(datetime_object). El problema es que, por alguna razón, str(datetime_object) genera un formato diferente cuando el objeto de fecha y hora se establece en cero microsegundos y algunas cadenas de tener este aspecto:

'2009-02-10 16:06:52'

¿Cómo puedo analizar estas cadenas y convertirlas en datetime object?

Es muy importante para obtener todos los datos en el objeto, incluyendo microsegundos.

Tengo que usar Python 2.5, he encontrado que la directiva de formato %f para microsegundos no existe en 2.5.

Respuesta

21

alternativa:

from datetime import datetime 

def str2datetime(s): 
    parts = s.split('.') 
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S") 
    return dt.replace(microsecond=int(parts[1])) 

Usando strptime sí para analizar la cadena de fecha/hora (lo que no necesita pensar en casos de esquina para una expresión regular).

+0

Gracias por esta respuesta! Yo sugeriría para cambiar la última línea a: dt.replace retorno (microsegundo = int (1000 * flotador ('0.' + partes [1]))) este maneja todos los casos correctamente, como por ejemplo, '2017-03-16 21: 20: 57.31' que debería dar 310us en lugar de 31us. – denizb

5

Alguien ya ha presentado un error con este tema: Issue 1982. Como necesita esto para trabajar con python 2.5, debe analizar el valor manualmente y luego manipular el objeto datetime.

2

tal vez no sea la mejor solución, pero se puede utilizar una expresión regular:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr) 
dt = datetime.datetime(*[int(x) for x in m.groups() if x]) 
10

utilizar el módulo dateutil. Admite una gama mucho más amplia de formatos de fecha y hora que los integrados en Python.

Tendrá que easy_install dateutil el siguiente código para trabajar:

from dateutil.parser import parser 

p = parser() 
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800') 
print datetime_with_microseconds.microsecond 

resultados en:

598799 
+0

+1 dateutil todo el camino – Yarin

Cuestiones relacionadas