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

PyArrow后端Pandas时区感知时间序列的时区转换问题

PyArrow后端Pandas时区感知时间序列的时区转换问题

我刚好碰到过类似的情况!当你在Pandas 2.0.0里搭配PyArrow后端处理带时区的时间戳时,确实会遇到tz_convert方法缺失的问题,这是因为当时PyArrow-backed的时间序列的dt访问器还没完全对齐numpy后端的功能。

问题还原

你用pd.read_sql加上dtype_backend="pyarrow"读取数据库数据后,得到的时间序列 dtype 是timestamp[ns, tz=UTC][pyarrow],但尝试用熟悉的df.timestamp.dt.tz_convert("Europe/Rome")转换时区时,会抛出错误:

AttributeError: 'ArrowTemporalProperties' object has no attribute 'tz_convert'

查看dir(df.timestamp.dt)也能发现,确实只有to_pydatetime、tz、tz_localize这些方法,没有tz_convert。

临时解决方案(官方修复前)

在官方补全这个功能之前,你可以用两种方法临时实现时区转换:

  • 方法一:先转成numpy后端的datetime类型,完成转换后再转回PyArrow类型(如果需要保持PyArrow后端的话):
    # 转换为numpy后端的时区感知datetime,转换时区后再转回PyArrow类型
    df["timestamp"] = df["timestamp"].astype("datetime64[ns, UTC]").dt.tz_convert("Europe/Rome").astype("timestamp[ns, Europe/Rome][pyarrow]")
    
  • 方法二:直接调用PyArrow的原生API处理数组:
    import pyarrow as pa
    # 获取PyArrow数组并转换时区
    pa_arr = df["timestamp"].to_arrow()
    converted_pa_arr = pa_arr.cast(pa.timestamp('ns', tz='Europe/Rome'))
    # 将转换后的数组放回DataFrame
    df["timestamp"] = converted_pa_arr
    

后续官方修复

你提到的GitHub上的开源issue和对应的PR确实是官方针对这个问题的修复路径,现在这个PR已经合并完成——也就是说,在较新的Pandas版本里,PyArrow后端的时间序列已经支持dt.tz_convert方法了,直接用你最初的代码df["timestamp"] = df.timestamp.dt.tz_convert("Europe/Rome")就可以正常运行啦。

备注:内容来源于stack exchange,提问作者Andrea Soprani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:59:30