使用Pandas的dt访问器转换时间戳为日期时出现错误
问题分析与解决
错误原因
你的代码触发该错误的核心逻辑:
- 初始的
date_clmn列用了Python标准库的datetime.date对象,导致列的 dtype 是object,而非pandas原生的datetime64[ns]类型。 - 执行
my_df.date_clmn - pd.DateOffset(months = 3)后,每个元素确实变成了Timestamp对象,但因为原列是objectdtype,新生成的lag_date列仍保持object类型——pandas不会自动把装着Timestamp的object列转换为原生datetime类型。 - pandas的
dt访问器只能作用于**dtype为datetime64[ns](或其他pandas原生时间类型)**的列,无法识别object列里的单个Timestamp对象,因此抛出AttributeError。
解决方法
两种简单修复方式:
方法一:提前转换初始日期列为pandas原生时间类型
在创建DataFrame后,先把date_clmn转为datetime64类型,再计算滞后日期:
import pandas as pd import datetime my_df = pd.DataFrame({'date_clmn': [datetime.date(2020, 1, 1), datetime.date(2020, 2, 1), datetime.date(2020, 3, 1)]}) # 转换为pandas原生时间类型 my_df['date_clmn'] = pd.to_datetime(my_df['date_clmn']) my_df['lag_date'] = my_df.date_clmn - pd.DateOffset(months = 3) # 此时可正常使用dt访问器 my_df.lag_date.dt.date
方法二:直接转换lag_date列为datetime类型
如果已经生成了lag_date列,直接对其进行类型转换即可:
# 转换lag_date列为datetime64类型 my_df['lag_date'] = pd.to_datetime(my_df['lag_date']) # 现在可以正常调用dt访问器 my_df.lag_date.dt.date
转换后,lag_date列的dtype会变为datetime64[ns],dt访问器就能正常工作。
内容的提问来源于stack exchange,提问作者user1700890
相关产品推荐
相关产品推荐

