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

如何在带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的矢量化和分组功能就能高效完成:

  1. 标记低价行
    先创建布尔列,标记价格低于阈值(比如30)的行:
threshold = 30
df["is_below"] = df["price"] < threshold
  1. 生成分组标签
    用cumsum()将连续的非低价行归为同一组,直到遇到下一个低价行:
df["group_id"] = df["is_below"].cumsum()
  1. 计算小时数
  • 对于每个分组,用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
  1. 清理临时列(可选)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:45:30