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

PyCharm虚拟环境执行Python日期代码遇AttributeError,Atom运行正常求助

解决AttributeError: Can only use .dt accessor with datetimelike values错误

问题根源

你的代码错误出在这一行:

df['diff'] = (df['date1'] - df['date2']).dt.days/30

因为你通过.dt.date把pd.to_datetime生成的datetime64类型转换成了Python原生date对象的Series,两个date对象相减得到的是timedelta对象的Series。而.dt访问器仅适用于pandas的datetime64类型,timedelta类型的Series不需要用.dt,直接调用.days属性即可。

解决方案

方案1:修改timedelta的调用方式

直接去掉.dt访问器:

df['date1'] = pd.to_datetime(df['date1'], format='%d%b%Y', errors='raise').dt.date
df['date2'] = pd.to_datetime(df['date2'], format='%d%b%Y', errors='raise').dt.date

# 去掉.dt,直接访问days属性
df['diff'] = (df['date1'] - df['date2']).days / 30

方案2:保留pandas datetime64类型(推荐)

放弃转换为Python原生date对象,保留pandas的datetime64类型,这样后续的时间操作会更灵活,也符合pandas的最佳实践:

# 不转成date,保留datetime64类型
df['date1'] = pd.to_datetime(df['date1'], format='%d%b%Y', errors='raise')
df['date2'] = pd.to_datetime(df['date2'], format='%d%b%Y', errors='raise')

# 此时使用.dt.days是正确的
df['diff'] = (df['date1'] - df['date2']).dt.days / 30

补充说明

  • 你添加的errors='raise'未触发错误,说明日期格式转换完全正常,问题不在数据本身,而是类型转换后的操作逻辑错误。
  • 所谓IDE差异只是表象,本质是不同环境下pandas对非法访问器的报错严格度不同,但代码本身存在逻辑问题,修正后在两个IDE中都能正常运行。

内容的提问来源于stack exchange,提问作者user8793002

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:03:14