如何忽略年份筛选Pandas DataFrame指定月日区间数据并优化性能?
无循环的年度日期范围筛选方案
直接利用Pandas DatetimeIndex的month和day属性构建向量化掩码,完全替代循环操作,性能提升显著,尤其适用于大数据集场景。
核心逻辑
我们需要保留以下三类数据:
- 4月份且日期≥15日
- 5-8月份的所有日期
- 9月份且日期≤16日
将这三个条件通过逻辑或(|)组合,即可生成高效的筛选掩码。
代码示例
1. 创建测试数据
import pandas as pd import numpy as np # 生成2020-2023年的每日时序数据 date_range = pd.date_range(start='2020-01-01', end='2023-12-31', freq='D') df = pd.DataFrame({'value': np.random.randn(len(date_range))}, index=date_range)
2. 构建掩码并操作数据
# 提取索引的月份和日期字段 month = df.index.month day = df.index.day # 构建筛选掩码 mask = ( (month == 4) & (day >= 15) | (month.isin([5, 6, 7, 8])) | (month == 9) & (day <= 16) ) # 筛选目标数据 filtered_df = df[mask] # 为筛选出的行设置值(例如将value字段设为0) df.loc[mask, 'value'] = 0
性能说明
这种向量化操作依赖Pandas内部的C级优化,避免了Python层面的循环遍历,在处理十万级以上数据时,速度比循环方案快几十倍甚至上百倍。
注意事项
- 逻辑自动适配所有年份,无需单独处理闰年(4月15日和9月16日在所有年份均存在)
- 若需调整日期范围,只需修改对应的月份和日期阈值即可
内容的提问来源于stack exchange,提问作者mosc9575
相关产品推荐
相关产品推荐

