如何使用python解析包含毫秒的时间字符串?

如何使用python解析包含毫秒的时间字符串?,python,date,time,datetime-parsing,Python,Date,Time,Datetime Parsing,我能够用time.strtime分析包含日期/时间的字符串 >>> 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')

我能够用time.strtime分析包含日期/时间的字符串

>>> 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
>>time.strtime('30/03/09 16:31:32.123','%d/%m/%y%H:%m:%S')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.5/_strtime.py”,strtime中的第333行
数据_字符串[found.end():])
ValueError:未转换的数据仍然存在:.123

我的第一个想法是尝试传递它“30/03/09 16:31:32.123”(在秒和毫秒之间用句点代替冒号),但这不起作用。快速浏览文档表明,分数秒在任何情况下都会被忽略


啊,版本差异。在2.6+中,您可以使用“%S.%f”来解析它。

来自python邮件列表:。那里有一个函数似乎可以完成这项工作,尽管正如作者在评论中提到的,这是一种黑客行为。它使用正则表达式来处理引发的异常,然后进行一些计算

在将正则表达式传递给strtime之前,您还可以尝试预先执行正则表达式和计算。

以给出引用(from)的代码:


Python 2.6添加了一个新的strftime/strptime宏
%f
。这些文档有点误导人,因为它们只提到微秒,但是
%f
实际解析的是秒的任何小数部分,最多有6位数字,这意味着它也适用于毫秒甚至厘米秒或分秒

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
但是,实际上并不存储毫秒/微秒。您最好使用
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

如您所见,
.123
被正确解释为
123000
微秒。

我知道这是一个较老的问题,但我仍在使用Python 2.4.3,我需要找到更好的方法将数据字符串转换为日期时间

如果datetime不支持%f且不需要尝试/例外,则解决方案是:

    (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 

这适用于python 2的输入字符串“2010-10-06 09:42:52.266000”

,我这样做了

print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])
它打印时间“%H:%M:%S”,将时间.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


实际上是不正确的。SO询问的是毫秒,但答案是微秒。不幸的是,Python没有毫秒指令,只有微秒指令(请参阅),但您可以通过在字符串末尾添加三个零并以微秒形式解析字符串来解决此问题,例如:

datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')
其中
time\u str
的格式类似于
30/03/09 16:31:32.123


希望这能有所帮助。

那不行;time.strtime不能用毫秒。是的,我知道那个线程。但我正在寻找一种更简单的方法。standart python库中是否有任何模块可以用毫秒进行时间解析?谢谢:版本2.6中的新版本:time和datetime对象支持%f格式代码,该代码扩展到对象中的微秒数,左边填充零到六个位置。哇,我可以告诉您python文档需要更新。没有提到任何关于
%f
。从2.7.3版开始的Python文档有点误导。对于strtime,%f实际上可以表示任意数量的小数位数,而不仅仅是微秒的6位。因此,上面的代码将解析32.123秒,并将其存储为123000µs,这是我们想要的。在
%f
中的数字在右边(而不是左边!)用零填充到小数点后6位。1被解析为100000,12被解析为120000,1234567产生
ValueError:未转换的数据仍然存在:7
这只是我的问题还是关于毫秒而不是微秒的问题?
dt.replace(微秒=int(毫秒))
这适用于Python 2.5和更早版本。Python2.6支持strtime“%f”,我最初也这么认为,但请参见答案和注释。它被保留为零填充微秒,因此
.123
被正确解释为123000微秒
datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')