Python datetime.strptime:忽略小数秒

11
我正在尝试将人类可读时间转换为一个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忽略分数部分(最好使用格式)?

我觉得我可能漏掉了一些非常基础的东西。感谢任何帮助。


2
@downvoter:您能告诉我为什么我的问题不好吗? - inspectorG4dget
你可以使用“%f”来解析小数秒。 - blaylockbk
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)

5
解决您的特定问题的方法:使用%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)

希望这可以帮助您。

1
指令%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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接