
pandas 的 `resample().ohlc()` 默认按右闭合(即时间桶右边界对齐)进行分组,导致结果中时间戳代表窗口结束时刻而非起始时刻;若需左对齐(如 18:30:30–18:30:40),需手动调整索引偏移。
在使用 Pandas 对时间序列数据执行 resample('10s').ohlc() 时,你可能会观察到一个看似“错位”的现象:例如原始数据中最早的时间戳是 2024-02-01 18:30:46,而 resample 输出的第一行时间戳却是 2024-02-01 18:30:40,对应 OHLC 值为 [1.0, 2.0, 1.0, 2.0]。这并非 bug,而是 Pandas 标准的右对齐(right-aligned)窗口行为 —— 即每个 10s 时间桶默认定义为 (t−10s, t],其中 t 是输出索引时间戳。
这意味着:
- 2024-02-01 18:30:40 表示窗口 (18:30:30, 18:30:40](含 18:30:40,不含 18:30:30);
- 因此该行聚合的是发生在 18:30:31 至 18:30:40 之间的所有价格(实际数据中 1.0 和 2.0 正好落在这个区间内)。
✅ 验证方法:检查原始数据是否按时间升序排列。若数据为降序(如题中所示:从 18:34:58 递减至 18:30:46),resample 仍严格按时间轴逻辑分桶,不受行序影响。
? 解决方案:实现左对齐窗口(如 [t, t+10s))
只需对 resample 后的索引统一减去一个 Timedelta:
import pandas as pd
# 假设 df 已设置 timestamp_column 为 DatetimeIndex
df_resample = df.resample('10s')['price'].ohlc()
df_resample.index -= pd.Timedelta('10s') # 将右边界对齐 → 左边界对齐
print(df_resample.head())
# 输出示例:
# open high low close
# timestamp_column
# 2024-02-01 18:30:30 1.0 2.0 1.0 2.0
# 2024-02-01 18:30:40 3.0 5.0 3.0 5.0
# 2024-02-01 18:30:50 6.0 8.0 6.0 8.0? 进阶提示:
立即学习“Python免费学习笔记(深入)”;
- 若需更灵活控制对齐方式(如居中、自定义偏移),可结合 offset 参数(Pandas ≥ 1.1):
df.resample('10s', offset='5s')['price'].ohlc() # 窗口中心对齐于每5秒 - 始终确保索引为 DatetimeIndex 且时区一致(必要时用 .dt.tz_localize() 或 .dt.tz_convert());
- resample 不会自动排序数据,但会基于时间戳值正确分桶;若需按时间升序处理(如填充、插值),建议先执行 df.sort_index()。
? 总结:Pandas 的 resample 行为完全符合设计预期,所谓“错误”实为对窗口语义理解偏差。通过显式索引偏移或 offset 参数,即可精准匹配业务所需的窗口定义(如 K 线起始时间、交易所撮合周期等)。










