python - 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 引起了问题。我认为问题与语言环境有关,但我尝试以各种不同的方式设置语言环境,但没有成功。
真的很感激一些关于如何在不使用切片的情况下解决这个问题的见解!
解决方案
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 之前的 -
推荐阅读
- html - 当我单击 (Ctrl + p) 在浏览器上打印任何内容时,如何获得默认背景图形?
- python - Pydantic 如何处理未知的字典键
- reactjs - 反应 js 和 Axios
- python - 在 jupyer notebook 中将 .ipynb 文件保存为 .py 文件会删除代码中的反斜杠
- javascript - 使选择选项取决于先前的选择
- flutter - google_mobile_ads:未能加载广告:3
- ssh - ssh:术语“ssh”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称
- kotlin - Kotlin Mock Fuel HTTP 响应使用 Mockito
- chainlink - 以下链链接履行请求文档不起作用
- react-native - 我正在处理本地博览会项目(后台获取时间)