10

我正在努力将人类可读的时间转换为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'

所以我认为这里的问题是一秒的一小部分是不可解析的。我真的不在乎那一秒的时间。没有对字符串进行切片,有没有一种方法可以让我datetime忽略一秒的一小部分(最好使用格式)?

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

4

3 回答 3

8

因为我真的不在乎一秒钟的分数,所以我应该只取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)
于 2012-07-02T22:49:32.910 回答
4

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

>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%S.%fZ")

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

问题是,据我所知, datetime.datetime.strptime 接受的格式通常不包括浮动秒数。解决方法是在创建 datetime 变量时忽略秒数,然后使用 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)

希望这可以帮助。

于 2014-05-17T11:52:05.273 回答
2

该指令%f将解释小数秒:https ://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

import datetime
humanTime = '2012/06/10T16:36:20.509Z'
datetime.datetime.strptime(humanTime, '%Y/%m/%dT%H:%M:%S.%fZ')
 
>> datetime.datetime(2012, 6, 10, 16, 36, 20, 509000)

Pandas 还可以用小数秒解析字符串...

import pandas as pd
humanTime = '2012/06/10T16:36:20.509Z'
pd.to_datetime(humanTime)

>> Timestamp('2012-06-10 16:36:20.509000+0000', tz='UTC')
于 2018-05-29T15:15:42.503 回答