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

Pandas筛选指定日期范围时遇KeyError异常求助(起止日期不在数据集)

解决日期范围过滤时的KeyError问题

先看看你的数据集:

DurationFilmDeadline
1777a02/04/2018
1777b02/04/2018
1777b02/04/2018
942b03/04/2018
941c03/04/2018

你遇到的KeyError问题,本质是因为你把日期字符串设为索引后,直接用df_filtered[start_date:end_date]这种切片方式——pandas的索引切片要求起始和结束的键必须存在于索引里,一旦传入的日期不在数据集的日期列表中,就会触发异常。

这里给你两种靠谱的解决办法:

方法一:用布尔索引过滤(推荐)

这种方式不依赖索引,直接通过日期比较筛选,完全不会因为边界日期不存在而报错,步骤如下:

  1. 先把Deadline列转换成datetime类型(一定要做,避免字符串比较的坑)
  2. 把传入的命令行参数也转换成datetime类型
  3. 用布尔条件筛选出范围内的行
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:07