Python中解析带时区的时间字符串为datetime对象报错求助
解决Python中datetime.strptime无法识别EDT时区的问题
这个报错的核心原因是:Python标准库的datetime.strptime()方法对%Z格式符的支持有限,尤其是像EDT这类夏令时时区缩写,在很多系统(比如Windows)中无法被正确识别,导致格式匹配失败。
下面给你几个可行的解决方案:
方案1:使用python-dateutil库(推荐)
python-dateutil的解析器可以自动识别绝大多数日期格式和时区缩写,不需要手动指定格式字符串,非常省心。
首先安装库:
pip install python-dateutil
然后修改代码:
from dateutil import parser # 直接解析字符串,自动处理时区 datetime_object = parser.parse('Apr-23-2018_10:57:19_EDT') print(datetime_object)
这个方法会返回带时区信息的datetime对象,完美解决你的问题。
方案2:手动处理时区(结合pytz)
如果不想依赖太多第三方库,可以先解析不带时区的部分,再用pytz关联正确的时区(它会自动处理夏令时/冬令时的切换,比手动写UTC偏移更准确):
首先安装pytz:
pip install pytz
然后编写代码:
from datetime import datetime import pytz # 提取字符串中不带时区的部分 dt_without_tz = '_'.join('Apr-23-2018_10:57:19_EDT'.split('_')[:2]) # 解析为无时区信息的datetime对象 naive_dt = datetime.strptime(dt_without_tz, '%b-%d-%Y_%H:%M:%S') # 关联EDT对应的时区(America/New_York会自动识别夏令时) edt_tz = pytz.timezone('America/New_York') datetime_object = edt_tz.localize(naive_dt, is_dst=True) # is_dst=True明确当前是夏令时 print(datetime_object)
方案3:替换时区缩写为UTC偏移(简易版)
如果你只需要处理EDT这类特定时区,可以把缩写替换成对应的UTC偏移,再用%z格式符解析:
from datetime import datetime # 把EDT替换为UTC-4的偏移格式(符合%z要求的格式) formatted_str = 'Apr-23-2018_10:57:19_EDT'.replace('EDT', '-0400') # 用%z解析UTC偏移 datetime_object = datetime.strptime(formatted_str, '%b-%d-%Y_%H:%M:%S_%z') print(datetime_object)
不过这个方法局限性大,需要手动维护时区缩写和偏移的对应关系,不推荐用于多时区场景。
内容的提问来源于stack exchange,提问作者Tanvir Hossain Bhuiyan
相关产品推荐
相关产品推荐

