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
相关产品推荐
相关产品推荐

