example - ¿Cómo puedo analizar una cadena de tiempo que contenga milisegundos con python?
timedelta python example (6)
Lo primero que pensé fue intentar pasar el ''30 / 03/09 16: 31: 32.123 ''(con un punto en lugar de dos puntos entre los segundos y los milisegundos). Pero eso no funcionó. Un rápido vistazo a los documentos indica que los segundos fraccionarios se ignoran en cualquier caso ...
Ah, diferencias de versión. Esto fue reportado como un error y ahora en 2.6+ puedes usar "% S.% f" para analizarlo.
Puedo analizar cadenas que contengan 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 "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
data_string[found.end():])
ValueError: unconverted data remains: .123
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 del.) 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 Iniciando el Carril 01
Para dar el código al que se refiere la respuesta de nstehr (de 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
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 usa 2.6 o 3.0, puede hacer esto:
time.strptime(''30/03/09 16:31:32.123'', ''%d/%m/%y %H:%M:%S.%f'')
Editar: nunca trabajo con el módulo de time
, así que no me di cuenta de esto al principio, pero parece que time.struct_time en realidad no almacena milisegundos / microsegundos. Puede ser mejor utilizar datetime
, así:
>>> 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 anterior, pero sigo usando Python 2.4.3 y necesitaba encontrar una forma mejor de convertir la cadena de datos a una fecha y hora.
La solución si datetime no admite% f y sin necesidad de probar / except 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"
de las listas de correo de python: análisis de subprocesos 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 truco. 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.