使用Pandas按日期过滤数据遇KeyError及类型错误,求解决办法
解决方案
一、直接使用日期列REP_DATE筛选数据
出现KeyError大概率是因为REP_DATE列未被正确解析为datetime类型,或者索引未排序。按以下步骤修正:
确保
REP_DATE是datetime类型
先检查列类型,如果不是datetime,先转换:import pandas as pd import datetime as dt # 转换列类型(若未完成转换) data['REP_DATE'] = pd.to_datetime(data['REP_DATE'])排序索引后再切片
设置索引后必须对索引排序,否则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)无需设索引的替代写法
不想修改索引的话,直接用布尔索引筛选,更稳妥: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类型后再过滤:
把YEAR列转为当年1月1日的datetime
data['YEAR_DATE'] = pd.to_datetime(data['YEAR'], format='%Y')筛选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
相关产品推荐
相关产品推荐

