Análisis de cadenas de fecha y hora que contienen nanosegundos

Tengo algunos archivos de registro con tiempos en el formato HH: MM :: SS.nano_seconds (por ejemplo, 01: 02: 03.123456789). Me gustaría crear una fecha y hora en Python para poder hacer cálculos matemáticos en el tiempo (por ejemplo, tomar diferencias de tiempo). strptime funciona bien para microsegundos usando% f. ¿Los módulos datetime y time de Python realmente no admiten nanosegundos?

Puede ver desde la fuente que los objetos de fecha y hora no admiten nada más fino que los microsegundos. Como señaló Mike Pennington en los comentarios, esto se debe a que los relojes de hardware reales no son tan precisos . Wikipedia dice que HPET tiene una frecuencia de “al menos 10 MHz”, lo que significa una marca por cada 100 nanosegundos.

Si puede vivir eliminando los últimos tres dígitos (que probablemente no sean muy significativos de todos modos), puede analizar esto simplemente cortando la cadena de entrada para que tenga solo seis dígitos después del punto decimal y analizando con %f . De lo contrario, parece que tendrás que implementar la resta tú mismo.

Naturalmente, puede utilizar nanosegundos e incluso unidades de tiempo más precisas (ps, fs, as) con numpy . Numpy tiene su propia implementación de Datetimes y Timedeltas , por lo que puede probar np.datetime64 :

 import numpy as np def str_to_ns(time_str): """ input: time in a format `hh:mm:ss.up_to_9_digits` """ h, m, s = time_str.split(":") int_s, ns = s.split(".") ns = map(lambda t, unit: np.timedelta64(t, unit), [h,m,int_s,ns.ljust(9, '0')],['h','m','s','ns']) return sum(ns) 

Luego puedes usar esta función de la siguiente manera:

 >>> src = "1:2:34.123456789" >>> out = str_to_ns(src) >>> print(out) 3754123456789 nanoseconds >>> out / np.timedelta64(1,'h') 1.0428120713302778 >>> out / np.timedelta64(1,'m') 62.568724279816664 >>> out / np.timedelta64(1,'s') 3754.123456789 

La aritmética también es posible:

 >>> t1, t2 = str_to_ns("1:0:12.12345678"), str_to_ns("1:0:12.12") >>> t1 - t2 numpy.timedelta64(3456780,'ns') 

Estoy de acuerdo en que no es tan natural, pero de esta manera puede lograr una precisión de tiempo arbitrario con solo un numpy .