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

2024-04-25 23:38:34 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试分析datetime时出错:

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引起了问题。我认为这个问题与语言环境有关,但我尝试过以各种不同的方式设置语言环境,但都没有成功。你知道吗

如果您能了解如何在不使用切片的情况下修复此问题,我将不胜感激!你知道吗


Tags: lambda语言dfdatetime环境time格式row
3条回答

python2 strptime()函数确实不支持时区的%z格式(因为时间.strtime()函数不支持它)。您有两种选择:

使用strtime进行分析时忽略时区:

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)

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

Python 3.6支持对“%z”进行解析时,如果采用这种格式:

+HHMM or -HHMM

如果日期的此部分包含冒号,则不支持分析“%z”:

+HH:MM or -HH:MM

但是,当“%z”节中有冒号时,Python3.7确实支持对该节进行解析。你知道吗

因此,使用python3.7而不是python3.6可以解决这个问题。你知道吗

如果可以,可以考虑使用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

相关问题 更多 >