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

使用Pandas按日期过滤数据遇KeyError及类型错误,求解决办法

解决方案

一、直接使用日期列REP_DATE筛选数据

出现KeyError大概率是因为REP_DATE列未被正确解析为datetime类型,或者索引未排序。按以下步骤修正:

  1. 确保REP_DATE是datetime类型
    先检查列类型,如果不是datetime,先转换:

    import pandas as pd
    import datetime as dt
    
    # 转换列类型(若未完成转换)
    data['REP_DATE'] = pd.to_datetime(data['REP_DATE'])
    
  2. 排序索引后再切片
    设置索引后必须对索引排序,否则loc切片可能失效:

    data.set_index('REP_DATE', inplace=True)
    data.sort_index(inplace=True)  # 关键步骤,缺失会导致KeyError
    
    start = dt.datetime(1980, 1, 1)
    end = dt.datetime.today()
    filtered_data = data.loc[start:end]
    print(filtered_data)
    
  3. 无需设索引的替代写法
    不想修改索引的话,直接用布尔索引筛选,更稳妥:

    data['REP_DATE'] = pd.to_datetime(data['REP_DATE'])
    start = dt.datetime(1980, 1, 1)
    end = dt.datetime.today()
    filtered_data = data[(data['REP_DATE'] >= start) & (data['REP_DATE'] <= end)]
    print(filtered_data)
    

二、整数年份转日期后筛选

如果想用整数YEAR列来筛选,可将年份转为datetime类型后再过滤:

  1. 把YEAR列转为当年1月1日的datetime

    data['YEAR_DATE'] = pd.to_datetime(data['YEAR'], format='%Y')
    
  2. 筛选1980年及以后的数据

    start_year = pd.to_datetime('1980-01-01')
    filtered_data = data[data['YEAR_DATE'] >= start_year]
    print(filtered_data)
    

错误原因说明

  • TypeError: '<' not supported between instances of 'int' and 'datetime.datetime':直接拿整数年份和datetime对象比较,类型不匹配,必须统一为datetime类型再操作。
  • KeyError: datetime.datetime(1980, 1, 1, 0, 0):要么是REP_DATE未转成datetime类型,要么是索引未排序,导致loc无法匹配到对应索引值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:45:12