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

OHLC重采样生成错误时间戳问题排查请求

解决Pandas重采样时起始时间跑偏的问题

为啥会出现这个问题?

你遇到的这个情况,本质是Pandas的resample()默认是按自然时间刻度来切分区间的。举个例子:

  • 10分钟周期的话,它默认会从整点、10分、20分...这样的时间点开始算区间,哪怕你的数据最早是09:15:01,它还是会生成09:10:00-09:20:00这个区间,时间戳就显示成区间起点09:10:00;
  • 20分钟周期同理,会从09:00:00开始第一个区间,这就和你期望的09:15:00起始点不符了。

怎么解决?

要让所有采样周期都从2019-01-24 09:15:00开始,有两种简单的方法:

方法1:直接指定起始锚点(最通用)

用resample()的origin参数,直接把你想要的起始时间传进去,不管什么周期都能对齐到这个点:

import sqlite3
import pandas as pd

conn = sqlite3.connect('sqlite_database.db')
query = "SELECT * FROM XXXX WHERE timestamp BETWEEN '2019-01-24 09:15:00' AND '2019-01-24 09:59:59'"
df = pd.read_sql_query(query, conn, index_col=['timestamp'], parse_dates=['timestamp'])

# 重点在这里:指定origin为目标起始时间
candles = df['ltp'].resample('5min', origin='2019-01-24 09:15:00').ohlc().bfill()
print(candles)

不管你换成3min、10min还是20min的周期,第一个采样区间都会从09:15:00开始,完美符合你的需求。

方法2:用偏移量调整(适合特定周期)

如果你想基于默认的时间边界来偏移,也可以用offset参数。比如10分钟周期默认从09:10开始,偏移5分钟就到09:15了:

candles = df['ltp'].resample('10min', offset='5min').ohlc().bfill()

不过这种方法需要针对不同周期计算偏移量,不如第一种通用,推荐优先用origin的方式。

额外小提示

  • 如果你不想保留那些只有后半段数据的起始区间(比如09:10-09:20里只有09:15之后的数据),可以把bfill()换成dropna(),直接删掉空值行:
    candles = df['ltp'].resample('10min', origin='2019-01-24 09:15:00').ohlc().dropna()
    
  • 你的代码里已经用parse_dates=['timestamp']把索引转成了datetime类型,这一步很关键,确保了重采样能正确识别时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:10