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

如何基于数据列连续同值提取pandas时间序列各窗口的首尾值

实现方案

核心思路是先给连续相同的data值打唯一分组标签,再按分组提取首尾记录即可,完整可运行代码如下:

import pandas as pd

# 生成测试数据集
idx = pd.date_range("2018-01-01", periods=100, freq="H")
dft = pd.DataFrame({"date": idx})
dft["data"] = ""

# 用loc赋值避免原生切片的SettingWithCopyWarning
dft.loc[0:4, "data"] = "a"
dft.loc[5:14, "data"] = "b"
dft.loc[15:19, "data"] = "c"
dft.loc[20:29, "data"] = "d"
dft.loc[30:39, "data"] = "a"
dft.loc[40:69, "data"] = "c"
dft.loc[70:84, "data"] = "b"
dft.loc[85:, "data"] = "c"

# 生成连续同值的分组标签
dft["group"] = (dft["data"] != dft["data"].shift()).cumsum()

# 方案1:仅提取每个窗口的起止时间和对应值
result = dft.groupby("group", as_index=False).agg(
    窗口开始时间=("date", "first"),
    窗口结束时间=("date", "last"),
    对应值=("data", "first")
).drop(columns="group")

# 方案2:保留原数据行的完整信息,输出每个窗口的首行、末行全量字段
first_records = dft.groupby("group").head(1)
last_records = dft.groupby("group").tail(1)
full_result = pd.concat([first_records, last_records]).sort_values(["group", "date"]).reset_index(drop=True)

逻辑说明

  • 分组标签生成逻辑:将data列向下偏移1行后和原列比较,值不一致的位置即为新连续窗口的起点,对布尔值累加后所有连续相同的data值会被分配到同一个分组id下,非连续出现的相同值会被分到不同分组,符合需求。
  • 分组聚合逻辑:按生成的group字段分组后,分别取每组的首条、末条记录即可得到每个连续同值窗口的对应数据。

内容的提问来源于stack exchange,提问作者AnonymousScientificUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:27:03