如何基于一个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个核心问题:
- 遍历对象错误:应该遍历待查询的df_test的日期,而非df_percent的所有日期
- 多变量初始化错误:
Tm3, Tm2, Tm1, T0, Tp1, Tp2, Tp3 = pd.DataFrame()会抛出解包错误,需要为每个变量单独初始化 - 索引操作错误: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
相关产品推荐
相关产品推荐

