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

