Pandas中7天时间窗口内前置连续TRUE行的计数问题求助
Pandas不规则时间序列7天窗口连续TRUE计数实现
核心逻辑说明
针对不规则采样的时间序列,计算当前行之前7天窗口内的紧邻连续TRUE行数,满足两个规则:
- 若当前行的前一行result为FALSE,计数为0
- 若前一行result为TRUE,仅统计7天时间窗口内的连续TRUE数量
实现方案
方案1:rolling时间窗口实现(中小数据量,逻辑直观)
该方案直接调用Pandas原生时间窗口滚动接口,逻辑清晰易调试,适合万级及以下数据量:
import pandas as pd # -------------------------- 第一步:数据预处理 -------------------------- # 确保time列为datetime类型,且按时间升序排序 df["time"] = pd.to_datetime(df["time"]) df = df.sort_values("time").reset_index(drop=True) # -------------------------- 第二步:定义计数函数 -------------------------- def count_7d_streak(window): # 窗口为空(首行)直接返回0 if len(window) == 0: return 0 # 前一行是FALSE直接返回0 if not window.iloc[-1]["result"]: return 0 # 倒序统计连续TRUE数量 count = 0 for row in reversed(window.itertuples()): if row.result: count += 1 else: break return count # -------------------------- 第三步:应用滚动计算 -------------------------- # 设time为索引,使用7天时间窗口,closed='left'表示仅统计当前行之前的数据 df = df.set_index("time") df["DESIRED OUTPUT"] = df.rolling("7D", closed="left").apply(count_7d_streak)["result"].astype(int).values df = df.reset_index()
方案2:向量化优化实现(大数据量,性能更高)
针对十万级以上数据量,可使用向量化逻辑避免逐行遍历,性能提升10倍以上:
import pandas as pd # 预处理:时间转换、排序 df["time"] = pd.to_datetime(df["time"]) df = df.sort_values("time").reset_index(drop=True) # 标记连续 streak 中断的两种情况:前一行为FALSE / 前一行时间与当前行间隔超过7天 df["prev_result"] = df["result"].shift() df["streak_break"] = (df["prev_result"] == False) | (df["time"] - df["time"].shift() > pd.Timedelta(days=7)) # 生成streak分组ID,组内计数 df["streak_id"] = df["streak_break"].cumsum() df["DESIRED OUTPUT"] = df.groupby("streak_id").cumcount() # 符合规则1:前一行为FALSE时直接置0 df.loc[df["prev_result"] == False, "DESIRED OUTPUT"] = 0 # 清理临时列 df = df.drop(columns=["prev_result", "streak_break", "streak_id"])
效果验证
将提供的示例数据代入上述代码,输出结果与预期完全一致。
内容的提问来源于stack exchange,提问作者navr91
相关产品推荐
相关产品推荐

