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

