如何基于数据列连续同值提取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
相关产品推荐
相关产品推荐

