Pandas重采样OHLC K线时如何获取各指标对应的时间点?
实现方案
你可以通过 Pandas 的命名聚合(Named Aggregation)结合 idxmax()/idxmin() 方法实现需求,核心逻辑是在每个5分钟分组内,匹配对应OHLC值的行索引(也就是采集时间)。
前提:你的 DataFrame 需使用 DatetimeIndex 作为索引,且已按时间升序排序,和你原有 resample 逻辑的前置要求一致。
完整代码示例
df = df.resample("5min").agg( # 原有聚合字段 stock_name=('stock_name', 'first'), tr_open=('tr_open', 'first'), tr_high=('tr_high', 'max'), tr_low=('tr_low', 'min'), tr_close=('tr_close', 'last'), # 新增对应采集时间字段 tr_time_open=('tr_open', lambda x: x.index[0]), tr_time_high=('tr_high', lambda x: x.idxmax()), tr_time_low=('tr_low', lambda x: x.idxmin()), tr_time_close=('tr_close', lambda x: x.index[-1]) )
特殊场景处理
- 如果某个5分钟周期内出现多个相同的最高值/最低值,
idxmax()/idxmin()默认返回第一个出现极值的时间。如果你需要取最后一个出现极值的时间,可以调整对应聚合逻辑:# 取最后一个出现最高值的时间 tr_time_high=('tr_high', lambda x: x[x == x.max()].index[-1]), # 取最后一个出现最低值的时间 tr_time_low=('tr_low', lambda x: x[x == x.min()].index[-1]) - 如果你的采集时间没有作为索引,是单独的
tr_time字段,可以调整resample参数和聚合逻辑:df = df.resample("5min", on='tr_time').agg( stock_name=('stock_name', 'first'), tr_open=('tr_open', 'first'), tr_high=('tr_high', 'max'), tr_low=('tr_low', 'min'), tr_close=('tr_close', 'last'), tr_time_open=('tr_time', 'first'), tr_time_high=('tr_time', lambda x: x[df.loc[x.index, 'tr_high'] == df.loc[x.index, 'tr_high'].max()].iloc[0]), tr_time_low=('tr_time', lambda x: x[df.loc[x.index, 'tr_low'] == df.loc[x.index, 'tr_low'].min()].iloc[0]), tr_time_close=('tr_time', 'last') )
内容的提问来源于stack exchange,提问作者Sumanth Lingappa
相关产品推荐
相关产品推荐

