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

如何通过用户输入日期及前后n天过滤Pandas DataFrame?

多公司股价DataFrame按指定日期前后n天筛选方案

前提准备

首先确保你的DataFrame满足两个基础条件:

  • DATE列是datetime类型,若不是先转换:
    import pandas as pd
    df['DATE'] = pd.to_datetime(df['DATE'])
    
  • 包含公司标识列(比如命名为COMPANY),用来区分不同公司的数据(你的示例数据未体现,实际场景需补充)

方法1:循环实现(满足你的需求)

如果一定要用循环,步骤如下:

  1. 获取所有唯一公司列表:
    companies = df['COMPANY'].unique()
    
  2. 初始化空列表存储每个公司的筛选结果:
    result_list = []
    
  3. 遍历每个公司,筛选指定日期前后数据:
    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])
    
  4. 合并所有结果:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:05:33