Pandas筛选指定日期范围时遇KeyError异常求助(起止日期不在数据集)
解决日期范围过滤时的KeyError问题
先看看你的数据集:
| Duration | Film | Deadline |
|---|---|---|
| 1777 | a | 02/04/2018 |
| 1777 | b | 02/04/2018 |
| 1777 | b | 02/04/2018 |
| 942 | b | 03/04/2018 |
| 941 | c | 03/04/2018 |
你遇到的KeyError问题,本质是因为你把日期字符串设为索引后,直接用df_filtered[start_date:end_date]这种切片方式——pandas的索引切片要求起始和结束的键必须存在于索引里,一旦传入的日期不在数据集的日期列表中,就会触发异常。
这里给你两种靠谱的解决办法:
方法一:用布尔索引过滤(推荐)
这种方式不依赖索引,直接通过日期比较筛选,完全不会因为边界日期不存在而报错,步骤如下:
- 先把
Deadline列转换成datetime类型(一定要做,避免字符串比较的坑) - 把传入的命令行参数也转换成datetime类型
- 用布尔条件筛选出范围内的行
import pandas as pd import sys # 读取你的数据集(这里假设你已经完成了读取) # df = pd.read_csv(...) # 1. 转换日期列格式 df['Deadline'] = pd.to_datetime(df['Deadline'], format='%d/%m/%Y') # 2. 转换命令行传入的日期参数 start_date = pd.to_datetime(sys.argv[1], format='%d/%m/%Y') end_date = pd.to_datetime(sys.argv[2], format='%d/%m/%Y') # 3. 布尔索引筛选 df_filtered = df[(df['Deadline'] >= start_date) & (df['Deadline'] <= end_date)]
方法二:用排序后的datetime索引切片
如果你一定要用索引来做,那得确保索引是排序后的datetime类型,这样pandas会自动处理边界不存在的情况,不会抛出KeyError:
import pandas as pd import sys # 读取数据集后转换日期列 df['Deadline'] = pd.to_datetime(df['Deadline'], format='%d/%m/%Y') # 设置并排序索引 df = df.set_index('Deadline').sort_index() # 转换命令行参数 start_date = pd.to_datetime(sys.argv[1], format='%d/%m/%Y') end_date = pd.to_datetime(sys.argv[2], format='%d/%m/%Y') # 使用loc进行切片 df_filtered = df.loc[start_date:end_date]
两种方法都能解决你的问题,个人更推荐第一种,逻辑更直观,也不需要修改原数据的索引结构。
内容的提问来源于stack exchange,提问作者Dimitris Tsarouhas
相关产品推荐
相关产品推荐

