如何在带DatetimeIndex的Pandas时间序列中计算距上次低价的小时数?
Pandas 实现距离上次低价的小时数计算
构造示例数据
首先还原你的示例DataFrame:
import pandas as pd data = {"price": [32.21, 10.20, 42.12, 1.05]} index = pd.to_datetime([ "2022-01-01 00:00:00", "2022-01-01 01:00:00", "2022-01-01 02:00:00", "2022-01-01 03:00:00" ]) df = pd.DataFrame(data, index=index)
核心实现步骤
无需转成列表/元组循环计算,用Pandas的矢量化和分组功能就能高效完成:
- 标记低价行
先创建布尔列,标记价格低于阈值(比如30)的行:
threshold = 30 df["is_below"] = df["price"] < threshold
- 生成分组标签
用cumsum()将连续的非低价行归为同一组,直到遇到下一个低价行:
df["group_id"] = df["is_below"].cumsum()
- 计算小时数
- 对于每个分组,用
cumcount()得到组内的偏移量(低价行本身为0,后续行递增) - 处理开头未出现低价的情况:计算这些行到第一个低价行的小时差
# 组内常规计算 df["hours_since_last_low"] = df.groupby("group_id").cumcount() # 修正开头的前置组 first_low_idx = df[df["is_below"]].index[0] pre_group = df.index <= first_low_idx df.loc[pre_group, "hours_since_last_low"] = (first_low_idx - df.loc[pre_group].index).total_seconds() // 3600
- 清理临时列(可选)
df.drop(["is_below", "group_id"], axis=1, inplace=True)
最终结果
运行后得到的DataFrame与你的示例一致:
price hours_since_last_low 2022-01-01 00:00:00 32.21 4.0 2022-01-01 01:00:00 10.20 0.0 2022-01-01 02:00:00 42.12 1.0 2022-01-01 03:00:00 1.05 0.0
优势说明
- 全程用Pandas内置的矢量化操作,比手动循环列表/元组效率高得多,尤其适合大数据量
- 分组逻辑自动处理了连续非低价行的计数,无需手动跟踪上一个低价点的位置
内容的提问来源于stack exchange,提问作者GregersDK
相关产品推荐
相关产品推荐

