¿Cómo puedo analizar una cadena de tiempo que contiene milisegundos con python?

Soy capaz de analizar cadenas que contienen fecha / hora con time.strptime

>>> import time >>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S') (2009, 3, 30, 16, 31, 32, 0, 89, -1) 

¿Cómo puedo analizar una cadena de tiempo que contiene milisegundos?

 >>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S') Traceback (most recent call last): File "", line 1, in  File "/usr/lib/python2.5/_strptime.py", line 333, in strptime data_string[found.end():]) ValueError: unconverted data remains: .123 

Python 2.6 agregó una nueva macro strftime / strptime %f , que hace microsegundos. No estoy seguro si esto está documentado en cualquier lugar. Pero si estás usando 2.6 o 3.0, puedes hacer esto:

 time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f') 

Edición: nunca trabajé realmente con el módulo de time , así que no noté esto al principio, pero parece que time.struct_time no almacena realmente milisegundos / microsegundos. Puede que sea mejor usar datetime , como esto:

 >>> from datetime import datetime >>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f') >>> a.microsecond 123000 

Sé que esta es una pregunta antigua, pero sigo usando Python 2.4.3 y necesitaba encontrar una mejor manera de convertir la cadena de datos a una fecha y hora.

La solución si datetime no es compatible con% f y sin necesidad de probar / excepto es:

  (dt, mSecs) = row[5].strip().split(".") dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6]) mSeconds = datetime.timedelta(microseconds = int(mSecs)) fullDateTime = dt + mSeconds 

Esto funciona para la cadena de entrada “2010-10-06 09: 42: 52.266000”

Para dar el código al que se refiere la respuesta de nstehr (desde su fuente ):

 def timeparse(t, format): """Parse a time string that might contain fractions of a second. Fractional seconds are supported using a fragile, miserable hack. Given a time string like '02:03:04.234234' and a format string of '%H:%M:%S', time.strptime() will raise a ValueError with this message: 'unconverted data remains: .234234'. If %S is in the format string and the ValueError matches as above, a datetime object will be created from the part that matches and the microseconds in the time string. """ try: return datetime.datetime(*time.strptime(t, format)[0:6]).time() except ValueError, msg: if "%S" in format: msg = str(msg) mat = re.match(r"unconverted data remains:" " \.([0-9]{1,6})$", msg) if mat is not None: # fractional seconds are present - this is the style # used by datetime's isoformat() method frac = "." + mat.group(1) t = t[:-len(frac)] t = datetime.datetime(*time.strptime(t, format)[0:6]) microsecond = int(float(frac)*1e6) return t.replace(microsecond=microsecond) else: mat = re.match(r"unconverted data remains:" " \,([0-9]{3,3})$", msg) if mat is not None: # fractional seconds are present - this is the style # used by the logging module frac = "." + mat.group(1) t = t[:-len(frac)] t = datetime.datetime(*time.strptime(t, format)[0:6]) microsecond = int(float(frac)*1e6) return t.replace(microsecond=microsecond) raise 

Mi primer pensamiento fue intentar pasarlo ’30 / 03/09 16: 31: 32.123 ‘(con un período en lugar de dos puntos entre los segundos y los milisegundos). Pero eso no funcionó. Un rápido vistazo a la documentación indica que los segundos fraccionarios se ignoran en cualquier caso …

Ah, las diferencias de versión. Esto se informó como un error y ahora en 2.6+ puede usar “% S.% f” para analizarlo.

de las listas de correo de python: analizando el hilo de milisegundos . Hay una función publicada allí que parece hacer el trabajo, aunque como se menciona en los comentarios del autor, es una especie de pirateo. Utiliza expresiones regulares para manejar la excepción que se genera, y luego hace algunos cálculos.

También puede intentar hacer las expresiones regulares y los cálculos por adelantado, antes de pasarlo a strptime.

Para Python 2 hice esto.

 print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1]) 

imprime el tiempo “% H:% M:% S”, divide el time.time () en dos subcadenas (antes y después de.) xxxxxxx.xx y como .xx son mis milisegundos, agrego la segunda subcadena a mi “% H:% M:% S ”

Espero que tenga sentido 🙂 Ejemplo de salida:

13: 31: 21.72 Parpadeo 01


13: 31: 21.81 FIN DE BLINK 01


13: 31: 26.3 Parpadeo 01


13: 31: 26.39 FIN DE BLINK 01


13: 31: 34.65 Carril de salida 01


La respuesta del DNS anterior es realmente incorrecta. El SO pregunta por milisegundos, pero la respuesta es por microsegundos. Desafortunadamente, Python`s no tiene una directiva por milisegundos, solo microsegundos (ver documento ), pero puedes solucionarlo agregando tres ceros al final de la cadena y analizando la cadena como microsegundos, algo así como:

 datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f') 

donde time_str tiene el formato 30/03/09 16:31:32.123 .

Espero que esto ayude.