问题:如何使用python解析包含毫秒的时间字符串?
我能够用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)
如何解析包含毫秒的时间字符串?
>>> 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
回答 0
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')
编辑:我从来没有真正使用过该time
模块,所以一开始我没有注意到这一点,但是看起来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
回答 1
我知道这是一个老问题,但是我仍在使用Python 2.4.3,我需要找到一种更好的方法将数据字符串转换为日期时间。
如果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”
回答 2
要给出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
回答 3
上面的DNS答案实际上是不正确的。SO询问的时间是毫秒,但答案是毫秒。不幸的是,Python没有毫秒指令,只有毫秒(请参阅doc),但是您可以通过在字符串末尾附加三个零并将字符串解析为毫秒来解决该问题,例如:
datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')
其中time_str
的格式如下30/03/09 16:31:32.123
。
希望这可以帮助。
回答 4
我的第一个念头是尝试将其传递为“ 30/03/09 16:31:32.123”(在秒和毫秒之间使用句点而不是冒号)。但这没有用。快速浏览文档表明在任何情况下都将忽略小数秒…
回答 5
从python邮件列表中:解析毫秒线程。尽管在作者的评论中提到,这有点像黑客,但其中张贴了一个似乎可以完成工作的功能。它使用正则表达式处理引发的异常,然后进行一些计算。
您还可以尝试先进行正则表达式和计算,然后再将其传递给strptime。
回答 6
对于python 2我做到了
print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])
它打印时间“%H:%M:%S”,将time.time()拆分为两个子字符串(在。之前和之后。)xxxxxxx.xx,由于.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