AWS Athena/Presto:如何将带时区的字符串转换为Timestamp?
嘿,我来帮你搞定这个带时区的时间字符串转datetime的问题!你遇到的情况挺常见的,parse_datetime()可能对这种带微秒和明确时区偏移的格式支持不够,下面给你几个靠谱的解决方案:
方法1:用Python标准库
datetime的strptime()精准匹配格式 标准库其实就能直接搞定,核心是要写出和你的时间字符串完全匹配的格式指令。你的字符串格式是YYYY-MM-DD HH:MM:SS.mmm+HH:MM,对应的格式参数如下:
%Y:4位年份%m:2位月份%d:2位日期%H:24小时制的小时数%M:分钟%S:秒%f:微秒(哪怕你的字符串只有3位,strptime会自动补零到6位,不影响结果)%z:时区偏移(Python 3.7及以上版本支持带冒号的±HH:MM格式)
直接上代码:
from datetime import datetime time_str = "2020-07-21 11:19:00.874+00:00" dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f%z") print(dt) # 输出:2020-07-21 11:19:00.874000+00:00 print(type(dt)) # 输出:<class 'datetime.datetime'>
如果你的Python版本低于3.7,%z不支持带冒号的时区格式,这时候只要先把字符串里的+00:00替换成+0000就能解决:
time_str_fixed = time_str.replace("+00:00", "+0000") dt = datetime.strptime(time_str_fixed, "%Y-%m-%d %H:%M:%S.%f%z")
方法2:用
dateutil.parser自动解析(省心首选) 要是不想手动写格式字符串,第三方库python-dateutil绝对是救星——它能自动识别绝大多数时间格式,包括带时区的这种。
先安装库(没装过的话):
pip install python-dateutil
然后几行代码搞定:
from dateutil import parser time_str = "2020-07-21 11:19:00.874+00:00" dt = parser.parse(time_str) print(dt) # 输出:2020-07-21 11:19:00.874000+00:00 print(type(dt)) # 输出:<class 'datetime.datetime'>
这个方法几乎不用操心格式细节,适合处理各种不规则的时间字符串,日常用起来特别省心。
方法3:用
pytz配合标准库(适合复杂时区操作) 如果之后需要做跨时区转换这类复杂操作,pytz是个不错的选择。对于解析当前这个字符串,我们可以先解析为带时区的datetime,再绑定到UTC时区(本身就是UTC,结果一致):
from datetime import datetime import pytz time_str = "2020-07-21 11:19:00.874+00:00" dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f%z").astimezone(pytz.utc) print(dt)
至于你之前用parse_datetime()失败的原因,大概率是这个函数(比如某些框架内置的版本)对微秒、带冒号的时区偏移这类细节支持有限,所以用上面的方法会更可靠。
内容的提问来源于stack exchange,提问作者Ignasi Mañé
相关产品推荐
相关产品推荐

