Как я могу разобрать строку времени, содержащую миллисекунды в ней с python?
Я могу разобрать строки, содержащие дату / время с времени.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)
Как я могу разобрать строку, содержащую миллисекунд?
>>> 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
6 ответов:
Python 2.6 добавил новый макрос strftime/strptime
%f
, что делает микросекунды. Не уверен, что это задокументировано где-либо. Но если вы используете 2.6 или 3.0, вы можете сделать это:time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
Edit: я никогда не работаю с
time
модуль, так что я не заметил этого сначала, но кажется, что время.struct_time на самом деле не хранит миллисекунды/микросекунды. Возможно, вам лучше использоватьdatetime
, например:>>> from datetime import datetime >>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f') >>> a.microsecond 123000
Я знаю, что это более старый вопрос, но я все еще использую Python 2.4.3, и мне нужно было найти лучший способ преобразования строки данных в datetime.
решение, если datetime не поддерживает %f и без необходимости try / except:
(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
это работает для входной строки "2010-10-06 09:42:52.266000"
дать код nstehr это относится к (с источник):
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
моей первой мыслью было попробовать передать его '30/03/09 16:31:32.123' (с точкой вместо двоеточия между секундами и миллисекундами. Но это не сработало. Быстрый взгляд на документы показывает, что дробные секунды игнорируются в любом случае...
Ах, различия версий. Это было сообщается как ошибка и теперь в 2.6+ вы можете использовать "%S.%f", чтобы разобрать его.
из списков рассылки python: разбор миллисекундного потока. Там размещена функция, которая, похоже, выполняет свою работу, хотя, как упоминалось в комментариях автора, это своего рода Хак. Он использует регулярные выражения для обработки исключения, которое возникает, а затем выполняет некоторые вычисления.
вы также можете попробовать сделать регулярные выражения и вычисления заранее, прежде чем передавать его в strptime.
для python 2 я сделал это
print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])
он печатает время "%H:%M:%S" , разбивает время.время () до двух подстрок (до и после .) xxxxxxx.ХХ и со .xx-это мои миллисекунды я добавляю вторую подстроку к моему "%H:%M:%S"
надеюсь, что это имеет смысл :) Пример вывода:
13:31:21.72 Блинк 01
13:31:21.81 КОНЕЦ МИГАНИЯ 01
13:31:26.3 Мигать 01
13:31:26.39 КОНЕЦ МИГАНИЯ 01
13:31:34.65 Стартовая Полоса 01