尝试解析日期时间时出现错误:
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引起了问题。我认为问题与语言环境有关,但是我尝试以各种不同的方式设置语言环境而没有成功。
非常感谢您在不使用切片的情况下如何解决此问题的见解!
答案 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将解决此问题。