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

如何在Pandas中正确将1分钟K线重采样为5分钟K线

问题描述

我尝试将1分钟K线重采样为5分钟K线时得到了错误的结果。
1分钟数据如下:
(1分钟K线数据截图)
我使用的重采样代码如下:

df2.resample("5min").agg({'open':'first',
                          'high':'max',
                          'low':'min',
                          'close':'last'})

得到的结果如下:
(重采样结果截图)
其中第二行时间为00:00:00的K线,high值应为110.34而非110.35,close值应为110.33,请问该如何修复这个问题?

补充数据生成代码

import datetime
import pandas as pd
idx = pd.date_range("2021-09-23 23:55", periods=11, freq="1min")
df = pd.DataFrame(index = idx)
data = [110.34,
        110.33,110.34,110.33,110.33,110.33,
        110.32,110.35,110.34,110.32,110.33,
        ]
df['open'] = data
df['high'] = data
df['low'] = data
df['close'] = data

df2 = df.resample("5min").agg({
    'open':'first',
    'high':'max',
    'low':'min',
    'close':'last'
})
print(df)
print("----")
print(df2)
解决方案

问题由两个可修正的点导致:

  1. 第一版测试的重采样代码存在语法错误:'low:'min' 中low的键名少写了右单引号,运行时会直接报错,实际使用时需要先修正为'low':'min'。
  2. 核心逻辑问题:pandas的resample方法默认使用区间左边界作为输出的时间标签,而金融K线的行业惯例是使用区间右边界作为时间标签(比如标注为00:00的5分钟K线,对应的是23:5500:00这个时间段的行情)。你现在得到的00:00标签的K线,实际聚合的是00:0000:05的1分钟数据,所以才会出现high值超出预期的问题。

只需要在调用resample时添加label='right'参数,指定用区间的右边界作为时间标签即可,修改后的重采样代码如下:

df2 = df.resample("5min", label='right').agg({
    'open':'first',
    'high':'max',
    'low':'min',
    'close':'last'
})

修改后输出的结果中,00:00标签对应的K线就是23:55到23:59的1分钟K线聚合结果,high值为110.34,close值为110.33,完全符合预期。
如果你的行情数据时间精度到秒/毫秒,需要把区间的右端点也包含进当前区间,可以额外添加closed='right'参数,避免边界数据归属错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:45:01