работа с высокоточными временными метками в python - PullRequest
4 голосов
/ 02 июня 2011

Привет, я работаю в python с datetime, и мне интересно, как лучше всего проанализировать эту метку времени.

Метки времени соответствуют стандарту ISO, вот пример "2010-06-19T08: 17:14.078685237Z "

Сейчас я использовал

time = datetime.datetime.strptime(timestamp.split(".")[0], "%Y-%m-%dT%H:%M:%S")
precisetime = time + datetime.timedelta(0,float("." + timestamp[:-1].split(".")[0]))

Такого рода работы, но я чувствую, что должен быть более обтекаемый способ (я очень плохо знаком с PythonЯ уверен, что я делаю это как осел).Кроме того, у меня есть наносекунды в моей метке времени, но только в микросекундах в моем объекте datetime, есть ли лучший модуль для работы?Мне нужно иметь возможность выполнять операции в срок, например вычитать время и помещать их в планировщик.

Есть ли лучший способ сделать это?

Ответы [ 5 ]

7 голосов
/ 20 ноября 2013

Вы можете использовать datetime64 от Numpy: http://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html

Поддерживает наносекунды и более высокую точность.

>>> import numpy as np
>>> np.version.version
'1.7.1'
>>> np.datetime64("2010-06-19T08:17:14.078685237Z", dtype="datetime64[ns]")
numpy.datetime64('2010-06-19T08:17:14.078685237+0000')
4 голосов
/ 11 октября 2012

datetime с точностью до микросекунд.Т.е. 10e-6.

Так что

14.078685237

будет усечено до

14.078685

, если вы сделаете то, что сделали выше.

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

Мне кажется смешным, что datetime этого не делает.

И для людей, которые говорят, что часы не достаточно точны.Это не единственный случай использования.Когда вы конвертируете взад-вперед с расстояния на время.(Умножение на скорость света.) 1 микросекунда составляет 300 м.300 метров - это длина 3 футбольных полей.Что является полным дерьмом для точности.

2 голосов
/ 02 июня 2011

В вашем подходе нет ничего похожего на задницу, но вы можете попробовать pyiso8601 или dateutil

1 голос
/ 02 июня 2011

Ваш код выглядит нормально.Я не знаю лучшего способа, но я не datetime эксперт.Лично я бы обернул это в функцию и выполнял бы немного меньше работы на строку, но это только мой стиль:

def parse_iso_timestamp(timestamp)
    ts, partial_seconds = timestamp[:-1].split('.')
    partial_seconds = float("." + partial_seconds)
    time = datetime.datetime.strptime(ts, "%Y-%m-%dT%H:%M:%S")
    precisedatetime = time + datetime.timedelta(seconds=partial_seconds)
    return precisedatetime

edit: Я согласен с ответом Роба Коуи.Не нужно изобретать велосипед.

0 голосов
/ 02 июня 2011

Вот альтернативный подход с использованием регулярного выражения, которое вы можете (или не можете) найти более чистым:

import re

timestamp = "2010-06-19T08:17:14.078685237Z"
ts_regex = re.compile(r"(\d{4})-(\d{1,2})-(\d{1,2})T(\d{2}):(\d{2}):(\d{2})\.(\d{6})")
precisetime = datetime.datetime(*map(int, ts_regex.match(timestamp).groups()))

Здесь оно разбито на несколько дополнительных шагов для обеспечения некоторой ясности:

>>> ts_regex.match(timestamp).groups()
('2010', '06', '19', '08', '17', '14', '078685')
>>> map(int, ts_regex.match(timestamp).groups())
[2010, 6, 19, 8, 17, 14, 78685]

Мы можем передать этот список непосредственно в инициализацию объекта datetime, используя расширение аргумента с помощью *, поскольку аргументы находятся в правильном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...