Подтвердить что ты не робот

Разбор строк datetime, содержащих наносекунды

У меня есть несколько файлов журналов со временем в формате HH: MM:: SS.nano_seconds (например, 01: 02: 03.123456789). Я хотел бы создать datetime в python, чтобы я мог аккуратно выполнять математику по времени (например, принимать временные различия). strptime хорошо работает для микросекунд, используя% f. Действительно ли модули времени и времени Python не поддерживают наносекунды?

4b9b3361

Ответ 1

Вы можете видеть из источника, что объекты datetime не поддерживают ничего более прекрасного, чем микросекунды. Как отметил Майк Пеннингтон в комментариях, это связано с тем, что фактические аппаратные часы не так точны. Википедия говорит, что HPET имеет частоту "не менее 10 МГц", что означает один тик на 100 наносекунд.

Если вы можете жить с выкидыванием последних трех цифр (что, вероятно, не слишком значимо), вы можете проанализировать это, просто нарезая строку ввода, чтобы иметь только шесть цифр после десятичной точки и разбор с %f, В противном случае, похоже, вам придется реализовать вычитание самостоятельно.

Ответ 2

Вы можете вполне естественно использовать наносекунды и даже более точные единицы времени (ps, fs, as) с numpy. Numpy имеет собственную реализацию Datetime и Timedeltas, поэтому вы можете попробовать 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)

Тогда вы можете использовать эту функцию следующим образом:

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

Арифметика также возможна:

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

Я согласен, что это не так естественно, но таким образом вы можете добиться произвольной высокой точности по времени с помощью всего лишь numpy.