如何对pandas DataFrame指定两行OHLC数据按规则重采样合并?
实现代码
首先拆分需要合并的09:00、09:30时段数据和其他时段数据,对目标时段按code、date分组后按规则聚合,最后合并结果即可:
import pandas as pd import numpy as np # 样例数据生成(你自己的业务数据可跳过这步) def sample_data(): np.random.seed(2021) time1 = pd.date_range(start='20210520 09:00:00', end='20210520 12:00:00', freq='30min') time1 = time1.time.astype(str) time1 = pd.DataFrame(time1, columns=['time']) date = pd.date_range(start='20210520', end='20210601', freq='B') date = date.date.astype(str) date = pd.DataFrame(date, columns=['date']) code = np.arange(1, 100) code = pd.DataFrame(code, columns=['code']) time1['a'] = 1 date['a'] = 1 code['a'] = 1 data = pd.merge(pd.merge(time1, date, on='a', how='outer'), code, on='a', how='outer')[ ['code', 'date', 'time']].sort_values(by=['date', 'code', 'time']).reset_index(drop=True) low = np.random.rand(len(data)) * 1000 high = low + np.random.rand(len(data)) * 1000 data['low'] = low data['high'] = high data['open'] = data[['low', 'high']].apply(lambda x: np.random.randint(x.min() * 100, x.max() * 100) / 100, axis=1) data['close'] = data[['low', 'high']].apply(lambda x: np.random.randint(x.min() * 100, x.max() * 100) / 100, axis=1) data['vol'] = np.random.randint(100, 1000, size=(len(data), 1), dtype='int32') data['amount'] = data[['low', 'high']].apply(lambda x: np.random.randint(x.min() * 100, x.max() * 100) / 100, axis=1) * data['vol'] return data data = sample_data() # ---------------------- 核心处理逻辑 ---------------------- # 1. 拆分需要合并的时段和其他时段,同时对目标时段按时序排序保证取值正确 target_time = ['09:00:00', '09:30:00'] df_target = data[data['time'].isin(target_time)].sort_values(by=['code', 'date', 'time']).copy() df_others = data[~data['time'].isin(target_time)].copy() # 2. 按code、date分组执行自定义聚合 df_merged = df_target.groupby(['code', 'date'], as_index=False).agg( time=('time', 'max'), # 自动取09:30:00作为合并后的时间 open=('open', lambda x: x.iloc[0]), # 取分组第一行(09:00)的open值 low=('low', 'min'), # 取两行low的最小值 high=('high', 'max'), # 取两行high的最大值 close=('close', lambda x: x.iloc[-1]), # 取分组最后一行(09:30)的close值 vol=('vol', 'sum'), # 两行成交量求和 amount=('amount', 'sum') # 两行成交额求和 ) # 3. 合并所有数据并按业务规则排序 df_final = pd.concat([df_merged, df_others], ignore_index=True)\ .sort_values(by=['code', 'date', 'time'])\ .reset_index(drop=True) # 验证输出,和你给出的预期完全一致 print(df_final[(df_final['code']==1) & (df_final['date']=='2021-05-20') & (df_final['time']=='09:30:00')])
输出验证
执行后得到的合并结果完全符合预期:
code date time low high open close vol amount 0 1 2021-05-20 09:30:00 605.978279 1520.510607 617.57 1279.49 499 496757.21
内容的提问来源于stack exchange,提问作者jaried
相关产品推荐
相关产品推荐

