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

pandas按年份筛选大型数据集时dt访问器属性错误如何解决

错误原因

你报错的核心原因是fillna(0)操作破坏了Date列的日期类型:

  • 使用pd.to_datetime转换日期时,errors='coerce'会把非法日期转为NaT(日期类型的空值),此时Date列仍为合法的datetime64类型
  • 后续全表执行fillna(0)时,Date列的NaT会被替换为整数0,整数和datetime对象共存的列会自动转为object dtype,自然无法使用.dt访问器。

你原本的按年份筛选代码逻辑本身没有错误,只要Date列恢复为datetime类型即可正常运行。

解决方案

方案1:调整空值填充逻辑(推荐)

不要直接全表执行fillna(0),分开处理日期列和数值列的空值,避免破坏日期类型:

# 1. 读取数据
df1=pd.read_csv(filename,
                sep="\t",
                error_bad_lines=False,
                usecols=['ID','Date', 'Value1', 'Value2'])

# 2. 转换日期类型,非法日期转NaT
df1['Date'] = pd.to_datetime(df1['Date'], errors='coerce')

# 3. 单独给日期列填充零日期(示例用1970-01-01,可按需调整)
df1['Date'] = df1['Date'].fillna(pd.Timestamp('1970-01-01'))

# 4. 数值列单独填充0
df1[['Value1','Value2']] = df1[['Value1','Value2']].fillna(0)

# 5. 正常执行年份筛选
df3 = df1[df1['Date'].dt.year == 2018]

方案2:保留原有逻辑,筛选前重转日期类型

如果一定要保留原有全表fillna(0)的操作,可在筛选前重新将Date列转回datetime类型:

# 将Object类型的Date列重新转回datetime,整数0会自动转为1970-01-01
df2['Date'] = pd.to_datetime(df2['Date'], errors='coerce')

# 再执行筛选即可
df3 = df2[df2['Date'].dt.year == 2018]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:24:03