如何通过用户输入日期及前后n天过滤Pandas DataFrame?
多公司股价DataFrame按指定日期前后n天筛选方案
前提准备
首先确保你的DataFrame满足两个基础条件:
DATE列是datetime类型,若不是先转换:import pandas as pd df['DATE'] = pd.to_datetime(df['DATE'])- 包含公司标识列(比如命名为
COMPANY),用来区分不同公司的数据(你的示例数据未体现,实际场景需补充)
方法1:循环实现(满足你的需求)
如果一定要用循环,步骤如下:
- 获取所有唯一公司列表:
companies = df['COMPANY'].unique() - 初始化空列表存储每个公司的筛选结果:
result_list = [] - 遍历每个公司,筛选指定日期前后数据:
t0 = pd.to_datetime('2021-01-25') # 用户输入的指定日期 n_before = 10 # 前n天 n_after = 20 # 后n天 for company in companies: # 取出当前公司的所有数据 company_data = df[df['COMPANY'] == company] # 检查该公司是否有t0当天的数据 if t0 not in company_data['DATE'].values: continue # 无数据则跳过,也可改为找最接近的日期 # 找到t0所在行的索引 t0_idx = company_data[company_data['DATE'] == t0].index[0] # 计算切片范围(防止索引越界) start_idx = max(company_data.index[0], t0_idx - n_before) end_idx = min(company_data.index[-1], t0_idx + n_after) # 截取数据并加入结果列表 result_list.append(company_data.loc[start_idx:end_idx]) - 合并所有结果:
final_result = pd.concat(result_list).reset_index(drop=True)
方法2:分组筛选(推荐,大数据效率更高)
循环在数据量大时速度较慢,更推荐用groupby结合自定义函数的方式,直接按公司分组处理:
按交易日行数筛选(前后n行数据)
def filter_window(group, t0, n_before=10, n_after=20): # 检查当前组是否包含t0日期 if t0 not in group['DATE'].values: return pd.DataFrame() # 无数据则返回空表 t0_idx = group[group['DATE'] == t0].index[0] start_idx = max(group.index[0], t0_idx - n_before) end_idx = min(group.index[-1], t0_idx + n_after) return group.loc[start_idx:end_idx] # 传入参数执行筛选 t0 = pd.to_datetime('2021-01-25') final_result = df.groupby('COMPANY').apply(filter_window, t0=t0, n_before=10, n_after=20).reset_index(drop=True)
按日历日范围筛选(前后n个自然日,忽略非交易日)
如果需要按实际日历天数(而非交易日数量)筛选,调整函数:
def filter_calendar_window(group, t0, n_before=10, n_after=20): start_date = t0 - pd.Timedelta(days=n_before) end_date = t0 + pd.Timedelta(days=n_after) return group[(group['DATE'] >= start_date) & (group['DATE'] <= end_date)] final_result = df.groupby('COMPANY').apply(filter_calendar_window, t0=t0, n_before=10, n_after=20).reset_index(drop=True)
关键说明
- 两种方法都能实现需求,循环适合小数据量或调试阶段,分组方法更适配大型数据集
- 若部分公司没有t0当天的数据,可根据需求修改逻辑:比如找最接近t0的日期作为基准,或直接跳过该公司
内容的提问来源于stack exchange,提问作者Begginer
相关产品推荐
相关产品推荐

