You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至Python 3.12.4后datetime处理报错,求新老版本兼容方案

新老Python版本兼容处理带时区的时间字符串转换问题

问题分析

在Python 3.12.4搭配对应新版本pandas的环境中,pd.to_datetime()自动推断格式时,会尝试用包含毫秒的格式匹配所有时间字符串,但你的数据同时存在两种格式:不带毫秒的2024-09-10 15:40:27+00:00和带毫秒的2024-09-10 18:13:50.201000+00:00,导致格式匹配失败。而旧版本pandas对这种混合格式的兼容性更好,能自动处理。

兼容解决方案

方案1:使用infer_datetime_format=True参数

该参数在新旧版本pandas中均能正常工作,可让pandas智能推断每个时间字符串的格式,无需指定统一格式:

test = pd.DataFrame(['2024-09-10 15:40:27+00:00','2024-09-10 18:13:50.201000+00:00'])
pd.to_datetime(test[0], infer_datetime_format=True).dt.tz_localize(None)

它在旧版本中能提升格式推断效率,新版本中也能正确识别混合格式的时间字符串。

方案2:指定多格式列表匹配

如果infer_datetime_format效果不理想,可以直接指定所有可能的格式,让pandas依次尝试匹配:

test = pd.DataFrame(['2024-09-10 15:40:27+00:00','2024-09-10 18:13:50.201000+00:00'])
formats = ["%Y-%m-%d %H:%M:%S%z", "%Y-%m-%d %H:%M:%S.%f%z"]
pd.to_datetime(test[0], format=formats).dt.tz_localize(None)

注意:format接受列表的特性支持pandas 0.25及以上版本,若你的旧版本pandas低于此版本,优先选择方案1。

方案3:分批次处理后合并

如果上述方案都不适用,可以拆分不同格式的数据分别转换,再合并结果,兼容性覆盖几乎所有pandas版本:

test = pd.DataFrame(['2024-09-10 15:40:27+00:00','2024-09-10 18:13:50.201000+00:00'])
# 筛选不带毫秒和带毫秒的行
mask_no_ms = test[0].str.len() == len('2024-09-10 15:40:27+00:00')
mask_has_ms = ~mask_no_ms

# 分别转换格式
col_no_ms = pd.to_datetime(test[0][mask_no_ms], format="%Y-%m-%d %H:%M:%S%z")
col_has_ms = pd.to_datetime(test[0][mask_has_ms], format="%Y-%m-%d %H:%M:%S.%f%z")

# 合并并恢复原顺序
result = pd.concat([col_no_ms, col_has_ms]).sort_index().dt.tz_localize(None)

内容的提问来源于stack exchange,提问作者Keith Hubbard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:22:16