pandas中pd.to_datetime无报错但结果仍为字符串如何解决
问题原因
无报错但时间列未转成datetime类型,是两个高频踩坑点导致的:
- 低版本Python(3.7以下)、低版本pandas(1.0以下)中,
%z格式符无法识别带冒号的时区偏移(比如你时间里的-05:00,旧版只认-0500这种无冒号格式),解析时会静默返回原字符串,不会抛出格式不匹配的错误。 - 列内混入了极少量不符合指定格式的异常值,且未做异常处理,导致整列类型回退为object(字符串)。
可直接复用的解决方案
方案1:最简写法(全版本兼容,推荐)
不用手动指定format,直接调用pandas原生的ISO时间解析能力,自动适配带冒号的时区格式:
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
如果需要把所有时间统一转为UTC时区,加参数utc=True即可
方案2:保留手动指定format的写法
先预处理字符串把时区偏移里的冒号去掉,再用你原来的格式串解析,兼容所有运行环境:
# 正则替换掉时区部分的冒号,比如把-05:00转成-0500 df['Timestamp'] = pd.to_datetime( df['Timestamp'].str.replace(r'([+-]\d{2}):(\d{2})$', r'\1\2', regex=True), format='%Y-%m-%dT%H:%M:%S%z' )
方案3:升级依赖版本
直接把Python升级到3.8+、pandas升级到1.3+,你原来写的代码不需要任何修改就能正常运行,新版本已经修复了带冒号时区的解析兼容问题。
结果验证
转换完成后执行以下代码校验类型:
print(df['Timestamp'].dtype)
正常会输出类似datetime64[ns, pytz.FixedOffset(-300)]的带时区datetime类型,不会再显示为object/字符串类型。
注意:转换完成后不要对该列做字符串类的赋值操作,否则会把列类型重新改回字符串。
内容的提问来源于stack exchange,提问作者Zoe Roberts
相关产品推荐
相关产品推荐

