python datetime.strptime:忽略一秒的分数

ins*_*get 8 format floating-point datetime python-2.7

我正在努力将人类可读时间转换为datetime对象.为了做到这一点,我正在使用datetime.datetime.strptime.

但是,很简单,我所拥有的人类可读时间包含一小段时间,我无法解析.如果这是一个常数,我可以将其作为格式的一部分.但是,由于它不是一个常数,我无法这样做.

这就是我现在正在做的事情:

>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%SZ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2012-06-10T16:36:20.507Z' does not match format '%Y-%m-%dT%H:%M:%SZ'
Run Code Online (Sandbox Code Playgroud)

所以我认为这里的问题是一秒的分数是不可解析的.我真的不在乎那一秒钟.如果没有切割字符串,有没有办法让我datetime忽略一秒的分数(最好用格式)?

我有一种感觉,我可能会遗漏一些非常基本的东西.我很感激任何帮助.

ins*_*get 6

因为我真的不关心一秒的分数,所以我应该只19读取人类可读字符串的第一个字符,并对其应用简单的格式.

>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> datetime.datetime.strptime(humanTime[:19], "%Y/%m/%dT%H:%M:%S")
datetime.datetime(2012, 6, 10, 16, 36, 20)
Run Code Online (Sandbox Code Playgroud)


Héc*_*tor 5

解决您的特定问题:使用 %f 表示微秒:

>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%S.%fZ")
Run Code Online (Sandbox Code Playgroud)

然而,对于一般情况来说,问题仍然存在。如果点后的数字超过 6 位,则此解决方案将不起作用。

问题是,据我所知, datetime.datetime.strptime 接受的格式一般不包括浮动秒。解决方法是在创建日期时间变量时忽略秒,然后使用 datetime.timedelta 添加秒。

>>> import numpy as np
>>> import datetime
>>> 
>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> dt_time_no_seconds = datetime.datetime.strptime(humanTime[:-8], "%Y/%m/%dT%H:%M")
>>> seconds = np.float(humanTime[-7:-1])
>>> dt_time = dt_time_no_seconds+datetime.timedelta(seconds=seconds)
>>> dt_time_no_seconds
datetime.datetime(2012, 6, 10, 16, 36)
>>> dt_time
datetime.datetime(2012, 6, 10, 16, 36, 20, 509000)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。