用strptime()无法正确解析微秒

时间:2016-07-11 07:46:00

标签: python python-2.7 datetime

我有一个字符串19:04:01:94891

当我将其传递给datetime.datetime.strptime()时:

datetime.strptime('19:04:01:94891', "%H:%M:%S:%f")

我得到以下结果:

datetime.datetime(1900, 1, 1, 19, 4, 1, 948910)

但是我希望结果是:

datetime.datetime(1900, 1, 1, 19, 4, 1, 94891)

区别在于microseconds

当我从文件中读取字符串时,如何在不修改字符串的情况下获得预期结果?

2 个答案:

答案 0 :(得分:2)

问题是您的输入不是零填充,因此如果我们处于11微秒,则问题会更严重。让我们解决问题的来源,并首先清理输入:

def fixMicroseconds(timestamp):
   parts = timestamp.split(':')

   return ':'.join(
       parts[:-1] + ['{:06d}'.format(int(parts[-1]))]
   )

现在它将被填充为零填充为6位数,因为Python更喜欢。

以下是此工作的一个示例:

In [1]: def fixMicroseconds(timestamp):
   ....:     parts = timestamp.split(':')
   ....:
   ....:     return ':'.join(
   ....:         parts[:-1] + ['{:06d}'.format(int(parts[-1]))]
   ....:     )
   ....:

In [2]: fixMicroseconds('19:04:01:94891')
Out[2]: '19:04:01:094891'

In [3]: fixMicroseconds('19:04:01:13')
Out[3]: '19:04:01:000013'

In [4]: datetime.datetime.strptime(fixMicroseconds('19:04:01:94891'), "%H:%M:%S:%f")
Out[4]: datetime.datetime(1900, 1, 1, 19, 4, 1, 94891)

你真的需要在调用strptime()之前清理输入,因为那是strptime()期望的(6位数)。

答案 1 :(得分:1)

来自strptime()的文档:

  

strptime()方法一起使用时,%f指令接受来自   右侧是一到六位数和零焊盘。

如果您的字符串始终包含5位数的微秒数,则可以在解析字符串后截断结果数字:

>>> from datetime import datetime
>>> dt = datetime.strptime("19:04:01:94891", "%H:%M:%S:%f")
>>> dt.replace(microsecond=dt.microsecond//10)
datetime.datetime(1900, 1, 1, 19, 4, 1, 94891)

“正确”的解决方案是将填充微秒数。既然你已经有了python2的例子,这里有一个使用python3的扩展解包:

>>> *a, b =  "19:04:01:94891".split(":")
>>> c = ":".join(a + ["{:0>6}".format(b)])
>>> c
'19:04:01:094891'
>>> datetime.strptime(c, "%H:%M:%S:%f")
datetime.datetime(1900, 1, 1, 19, 4, 1, 94891)