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

