升级至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
相关产品推荐
相关产品推荐

