即使看起来正确,strptime格式也不匹配?

时间:2019-07-05 13:40:16

标签: python locale strptime

尝试解析日期时间时出现错误:

ValueError: ("time data '2019-07-05T10:19:42+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'", 'occurred at index 0')

产生此错误的行是:

df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'], '%Y-%m-%dT%H:%M:%S%z').strftime("%Y%m"), axis=1)

据我所知格式正确,并且代码在其他计算机上运行正常。

当我从格式中删除%z并仅获取要格式化的数据的一部分时,它会起作用,例如,如下所示:

df['yearmonth'] = df.apply(lambda row: datetime.strptime(row['createdAt'][:19], '%Y-%m-%dT%H:%M:%S').strftime("%Y%m"), axis=1)

所以我猜测%z引起了问题。我认为问题与语言环境有关,但是我尝试以各种不同的方式设置语言环境而没有成功。

非常感谢您在不使用切片的情况下如何解决此问题的见解!

3 个答案:

答案 0 :(得分:2)

Python 2 strptime()函数确实不支持时区<%> 格式(因为底层的time.strptime()函数不支持)它)。您有两种选择:

使用strptime解析时忽略时区:

time_obj = datetime.datetime.strptime(time_str[:19], '%Y-%m-%dT%H:%M:%S')

使用dateutil模块,它的解析函数确实处理时区:

from dateutil.parser import parse
time_obj = parse(time_str)

您还可以升级到 Python 3.2 或更高版本,只要您从输入中删除了last,然后将时区支持提高到%z就可以使用的程度。 -在%z之前

答案 1 :(得分:2)

如果可以,请考虑使用dateutil

import datetime
import dateutil.parser

my_date_str = '2019-07-05T10:19:42+00:00'
my_date = dateutil.parser.parse(my_date_str)
print(type(my_date)) # <class 'datetime.datetime'>  
print(my_date.strftime('%Y%m')) # 201907

答案 2 :(得分:0)

Python 3.6支持以下格式的“%z”解析:

+HHMM or -HHMM

如果日期的这一部分包含冒号,则它不支持'%z'解析:

+HH:MM or -HH:MM

但是,当此部分中有冒号时,Python 3.7确实支持对'%z'部分的解析。

因此,使用Python 3.7代替Python 3.6将解决此问题。