如何将Pandas数据框中的Arrow对象转换为datetime64[ns]类型
解决Pandas中Arrow日期类型转datetime64[ns]的问题
问题原因
你之前的方法无效,是因为单个修改DataFrame元素不会改变列的整体数据类型。原列存储Arrow对象时 dtype 为object,即使把某一个元素换成Python datetime对象,列的 dtype 依然保持object,必须显式转换整列才能切换到datetime64[ns]。
可行解决方案
方案1:创建DataFrame时直接转换
在构建DataFrame前就把Arrow对象转为Python datetime,这样Pandas会自动识别为datetime64[ns]类型:
import arrow import pandas as pd test = arrow.utcnow() df = pd.DataFrame({"test": [test.datetime]}) # 直接传入datetime对象 print(df.dtypes) # 输出: test datetime64[ns]
方案2:对已有DataFrame整列转换
如果已经有包含Arrow对象的DataFrame,用pd.to_datetime配合apply提取datetime属性,批量转换整列:
import arrow import pandas as pd test = arrow.utcnow() df = pd.DataFrame({"test": [test]}) # 整列转换为datetime64[ns] df['test'] = pd.to_datetime(df['test'].apply(lambda x: x.datetime)) print(df.dtypes) # 输出: test datetime64[ns]
方案3:利用Arrow的to_pydatetime方法(等效方案)
Arrow对象的to_pydatetime()方法和.datetime属性效果一致,也可以用来转换:
# 创建时转换 df = pd.DataFrame({"test": [test.to_pydatetime()]}) # 已有DataFrame整列转换 df['test'] = pd.to_datetime(df['test'].apply(lambda x: x.to_pydatetime()))
补充说明
虽然Arrow和Pandas早期兼容性确实有问题,但现在通过提取Python datetime对象再交给Pandas处理,就能完美适配datetime64[ns]类型,核心是要确保整列统一转换,而不是修改单个元素。
内容的提问来源于stack exchange,提问作者Daddedebad
相关产品推荐
相关产品推荐

