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

如何基于一个pandas DataFrame的日期提取另一个DataFrame的对应数据

Pandas多DataFrame按工作日偏移筛选数据方案

数据说明

待查询日期DataFrame(df_test)

import pandas as pd
from pandas.tseries.offsets import BDay

df_test = pd.DataFrame({
'Specific_date': {0: '2016-01-10', 1: '2016-01-12', 2: '2016-01-13', 3: '2016-01-19'}})
df_test['Specific_date'] = pd.to_datetime(df_test['Specific_date'])

日内涨跌幅DataFrame(df_percent)

索引为交易日期,列名为日内小时时段,值为对应时段涨跌幅,示例数据如下:

Hour        9am     10am    11am    12pm    1pm     2pm     3pm     4pm
Date                                
2016-01-05  20.6475 20.5900 20.4225 20.6275 20.1600 19.6500 19.6250 19.4100
2016-01-06  21.3550 20.8675 20.6100 20.6525 20.8900 21.0125 21.0600 20.5125
2016-01-07  23.0075 22.7975 23.0050 23.5975 24.4675 25.2450 25.1600 24.9575
2016-01-08  22.9125 23.2400 23.8575 23.9475 24.0425 24.4000 25.7950 26.7625
2016-01-11  25.7500 25.9100 25.8800 25.9325 26.7650 26.4025 24.9425 24.2725
2016-01-12  22.5500 22.6900 23.2700 23.2550 23.1425 22.8175 22.2925 22.4175
2016-01-13  21.8175 22.6200 22.5225 23.2675 23.9650 25.0500 24.9575 25.1100
2016-01-14  25.4600 25.0050 24.2875 24.2050 24.2850 23.7800 23.6775 23.9575
2016-01-15  28.3200 28.5925 27.8400 28.8900 29.2925 28.4225 27.6525 27.1525
2016-01-19  26.1625 26.3400 26.0725 26.2550 26.3275 26.9225 26.5725 26.0075

需求

以df_test中的每个日期为T=0,分别提取对应日期前3、2、1个工作日(T-3、T-2、T-1)和后3、2、1个工作日(T+1、T+2、T+3)的所有涨跌幅数据,分别存入对应的新DataFrame,遍历所有待查询日期后完成数据拼接。

原有逻辑问题

原有伪代码存在3个核心问题:

  1. 遍历对象错误:应该遍历待查询的df_test的日期,而非df_percent的所有日期
  2. 多变量初始化错误:Tm3, Tm2, Tm1, T0, Tp1, Tp2, Tp3 = pd.DataFrame()会抛出解包错误,需要为每个变量单独初始化
  3. 索引操作错误:df_percent的日期是索引而非列,不能通过df_percent['Date']取值

实现代码

# 先确认df_percent的索引为datetime类型
df_percent.index = pd.to_datetime(df_percent.index)

# 初始化7个结果DataFrame
Tm3, Tm2, Tm1, T0, Tp1, Tp2, Tp3 = [pd.DataFrame() for _ in range(7)]

# 遍历所有待查询日期
for t0_date in df_test['Specific_date']:
    # 过滤不在涨跌幅数据中的待查询日期
    if t0_date not in df_percent.index:
        continue
    # 计算各偏移工作日日期
    offset_dates = {
        'Tm3': t0_date - BDay(3),
        'Tm2': t0_date - BDay(2),
        'Tm1': t0_date - BDay(1),
        'T0': t0_date,
        'Tp1': t0_date + BDay(1),
        'Tp2': t0_date + BDay(2),
        'Tp3': t0_date + BDay(3)
    }
    # 匹配数据并拼接
    for name, offset_date in offset_dates.items():
        if offset_date in df_percent.index:
            locals()[name] = pd.concat([locals()[name], df_percent.loc[[offset_date]]])

预期结果验证

上述代码输出的Tm3与示例预期完全一致:

Hour        9am     10am    11am    12pm    1pm     2pm     3pm     4pm
Date
2016-01-06  21.3550 20.8675 20.6100 20.6525 20.8900 21.0125 21.0600 20.5125
2016-01-07  23.0075 22.7975 23.0050 23.5975 24.4675 25.2450 25.1600 24.9575
2016-01-08  22.9125 23.2400 23.8575 23.9475 24.0425 24.4000 25.7950 26.7625
2016-01-13  21.8175 22.6200 22.5225 23.2675 23.9650 25.0500 24.9575 25.1100

内容的提问来源于stack exchange,提问作者jd_h2003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:03