You need to enable JavaScript to run this app. 如何对pandas DataFrame指定两行OHLC数据按规则重采样合并?
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 03:54:00