使用Pandas DataFrame合并日线与5分钟数据并添加前两根K线列
解决方案
要实现将5分钟线的前两根K线数据合并到日线数据中,可按以下步骤操作:
1. 构造示例数据(真实场景可跳过)
先还原示例中的两个DataFrame,方便测试代码:
import pandas as pd # 日线数据 dailyDf = pd.DataFrame( {'Open': [100, 102], 'Close': [101, 103]}, index=pd.Index(['01-01-2022', '01-02-2022'], name='Date') ) # 5分钟线数据 fiveMinDf = pd.DataFrame( {'Open': [100.1, 100.3, 100.9, 100.6, 100.8, 100.9], 'Close': [100.2, 100.4, 100.9, 100.7, 100.49, 100.9]}, index=pd.Index(['01-01-2022-9.30', '01-01-2022-9.35', '01-01-2022-9:40', '01-02-2022-9.30', '01-02-2022-9.35', '01-02-2022-9:40'], name='Datetime') )
2. 处理5分钟线数据
拆分日期与时间
从5分钟线的索引中提取日期和时间,统一时间格式(将冒号替换为点):
fiveMinDf = fiveMinDf.reset_index() # 拆分索引为日期和时间两列 fiveMinDf[['Date', 'Time']] = fiveMinDf['Datetime'].str.split('-', n=1, expand=True) # 统一时间格式,把9:40转为9.40 fiveMinDf['Time'] = fiveMinDf['Time'].str.replace(':', '.')
筛选每个交易日的前两根K线
按日期分组,保留每组的前两行数据:
top_two_k = fiveMinDf.groupby('Date').head(2)
转换为宽格式生成目标列
将数据转为宽格式,把时间作为列名的一部分,生成open_5min_9.30这类格式的列名:
# 透视转换为宽格式 wide_5min = top_two_k.pivot( index='Date', columns='Time', values=['Open', 'Close'] ).rename_axis(columns=[None, None]) # 合并多级列名,生成最终列名 wide_5min.columns = [f'{col[0]}_5min_{col[1]}' for col in wide_5min.columns]
3. 合并日线与处理后的5分钟数据
用join方法按日期合并两个DataFrame:
merged_df = dailyDf.join(wide_5min)
最终得到的merged_df即为目标结果:
Open Close open_5min_9.30 open_5min_9.35 close_5min_9.30 close_5min_9.35 Date 01-01-2022 100 101 100.1 100.3 100.2 100.4 01-02-2022 102 103 100.6 100.8 100.7 100.49
内容的提问来源于stack exchange,提问作者user93796
相关产品推荐
相关产品推荐

