Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t使用strtime()正确解析微秒_Python_Python 2.7_Datetime - Fatal编程技术网

Python Can';t使用strtime()正确解析微秒

Python Can';t使用strtime()正确解析微秒,python,python-2.7,datetime,Python,Python 2.7,Datetime,我有一个字符串19:04:01:94891 当我将其传递给datetime.datetime.strtime()as时: 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) 区别在于微秒 从文件中读取字符串时,如何

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

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

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)
区别在于
微秒

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

来自以下文档:

当与
strtime()
方法一起使用时,
%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)
更可靠的解决方案是将输入字符串左侧的微秒数归零。由于您已经有了Python 2的示例,下面是一个使用Python 3扩展解包的示例:

>>> *rest, ms = '19:04:01:94891'.split(':')
>>> date_string = ':'.join(rest + [ms.zfill(6)])
>>> date_string
'19:04:01:094891'
>>> datetime.strptime(date_string, '%H:%M:%S:%f')
datetime.datetime(1900, 1, 1, 19, 4, 1, 94891)

问题是你的输入不是零填充的,所以如果我们在11微秒的时候,问题会更严重。让我们从源头解决问题,并首先清理输入:

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

   return ':'.join(
       parts[:-1] + ['{:06d}'.format(int(parts[-1]))]
   )
现在,它将按照Python的喜好从零填充到6位

下面是一个这样工作的例子:

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)

在调用
strtime()
之前,您确实需要清理输入,因为这是
strtime()
所期望的(6位)。

如果不修改字符串,就不可能:您的建议是什么?后处理是一种可能且简单的解决方案。如果你想要预处理,我同意@AshwiniChaudhary。