如何在Pandas数据集中按日期范围筛选生成变量?
Pandas 日期筛选问题解决方法
问题根源
你之前的筛选写法逻辑错误——data['todays_date']['04-20-20']是试图用日期字符串去索引列,而列中存储的是datetime对象,自然会触发KeyError,和日期格式转换本身关系不大,主要是对Pandas的布尔筛选逻辑理解有误。
第一步:确认日期转换有效性
先确保todays_date确实被正确转成datetime类型:
# 重新执行转换(确保格式匹配) data['todays_date'] = pd.to_datetime(data['todays_date'], format='%m-%d-%y') # 验证类型,输出应为 datetime64[ns] print(data['todays_date'].dtype)
如果转换时存在无效日期,可添加errors='coerce'将其转为NaT(缺失日期),后续再处理:
data['todays_date'] = pd.to_datetime(data['todays_date'], format='%m-%d-%y', errors='coerce')
正确的日期筛选方法
1. 筛选03-23-23之前的实例
# 先将目标 cutoff 日期转为 datetime 对象 cutoff = pd.to_datetime('03-23-23', format='%m-%d-%y') # 布尔筛选,保留日期早于 cutoff 的行 early_instances = data[data['todays_date'] < cutoff]
若需要包含03-23-23当天,将<改为<=即可。
2. 筛选03-24-23至11-12-23之间的实例
方法一:用布尔运算符组合条件
start = pd.to_datetime('03-24-23', format='%m-%d-%y') end = pd.to_datetime('11-12-23', format='%m-%d-%y') # 注意用&连接条件,且每个条件需加括号 later_instances = data[(data['todays_date'] >= start) & (data['todays_date'] <= end)]
方法二:用between方法简化代码
later_instances = data[data['todays_date'].between(start, end)]
进阶优化:将日期设为索引
如果需要频繁按日期筛选,把todays_date设为索引会更高效,还支持切片操作:
# 设置日期为索引 data = data.set_index('todays_date') # 筛选早于 cutoff 的数据 early_instances = data[data.index < cutoff] # 筛选日期范围(包含首尾) later_instances = data.loc[start:end]
内容的提问来源于stack exchange,提问作者WestinT
相关产品推荐
相关产品推荐

