Python中解析带时区时间格式并提取值的问题求助
搞定带时区偏移的时间字符串解析问题
我来帮你捋清楚这个问题哈,你用strptime()的时候踩了两个小坑,先给你说清楚为啥报错,再给你几个靠谱的解决办法:
为啥你的代码会报错?
你写的格式字符串%Y %m %d %H:%M:%S.%f %Z有两处不匹配:
- 你的原时间字符串里日期是
2018-03-11(用连字符分隔),但格式里写的是%Y %m %d(空格分隔),这首先就对不上; - 最关键的是
%Z这个格式符——它是用来匹配时区名称的(比如UTC、CET这种),而你的时间里是+01:00这种UTC偏移量,%Z根本认不出这种格式,这就是报错的核心原因。
正确的解析方法
方法1:用Python标准库自带的%z格式符(Python3.2+可用)
其实标准库的datetime.strptime早就支持解析UTC偏移量了,用%z就行,只要把格式字符串调整得和原字符串完全对应:
from datetime import datetime time_str = "2018-03-11 13:15:31.734874+01:00" # 注意格式里的分隔符要和原字符串完全一致,偏移量用%z,而且不要加空格 format_str = "%Y-%m-%d %H:%M:%S.%f%z" dt = datetime.strptime(time_str, format_str) print(dt) # 输出:2018-03-11 13:15:31.734874+01:00
解析出来的datetime对象会自带时区信息,后续想转UTC或者其他时区都很方便。
方法2:用dateutil自动解析(省心首选)
如果你不想纠结格式字符串,或者需要兼容各种奇奇怪怪的时间格式,python-dateutil库的解析器能自动识别这种带偏移的时间,简直是懒人福音:
先装库:
pip install python-dateutil
然后直接用:
from dateutil import parser time_str = "2018-03-11 13:15:31.734874+01:00" dt = parser.parse(time_str) print(dt) # 输出:2018-03-11 13:15:31.734874+01:00
不管是带连字符、空格还是不同的时区格式,它基本都能搞定,不用你手动写格式。
方法3:用pandas处理批量数据(适合数据分析场景)
如果你是在处理批量的时间数据,pandas的to_datetime函数也能轻松应对这种格式:
import pandas as pd time_str = "2018-03-11 13:15:31.734874+01:00" dt = pd.to_datetime(time_str) print(dt) # 输出:2018-03-11 13:15:31.734874+01:00
而且它支持直接传入列表批量解析,效率比循环用strptime高多了。
小提示
- 要是你想把解析后的时间转成UTC,直接用
dt.astimezone(datetime.timezone.utc)就行; - 注意在Windows系统的Python3.6之前,
%z可能有兼容性问题,遇到这种情况优先用dateutil的方法就好。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

