首页 > 解决方案 > 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 引起了问题。我认为问题与语言环境有关,但我尝试以各种不同的方式设置语言环境,但没有成功。

真的很感激一些关于如何在不使用切片的情况下解决这个问题的见解!

标签: pythonlocalestrptime

解决方案


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

使用 strptime 解析时忽略时区:

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

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

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

您还可以升级到Python 3.2或更高版本,其中时区支持已经改进到%z可以工作的程度,前提是您从输入中删除最后一个 : 和 %z 之前的 -


推荐阅读