如何在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)
解决方案
问题由两个可修正的点导致:
- 第一版测试的重采样代码存在语法错误:
'low:'min'中low的键名少写了右单引号,运行时会直接报错,实际使用时需要先修正为'low':'min'。 - 核心逻辑问题: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
相关产品推荐
相关产品推荐

