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

Pandas:按规则拆分经连续重复值过滤的时间序列DataFrame

处理时间序列并拆分子DataFrame

你的过滤代码已经能正确保留最多连续2个相同值的行,但要实现按缺口拆分多个子DataFrame,关键是找到过滤后数据中索引断裂的位置(这些位置就是原始数据中被删除的连续重复值区域,即缺口),然后按这些位置分组拆分。

完整实现步骤

  1. 标记连续相同值的组内序号,筛选出最多连续2个的行;
  2. 检测过滤后数据的索引连续性,生成拆分分组标签;
  3. 根据分组标签拆分出多个子DataFrame。

代码实现

import pandas as pd

def process_time_series(df, value_column):
    # 获取值序列
    value_series = df[value_column]
    
    # 计算每个连续相同值组内的元素序号(从1开始)
    group_ids = value_series.ne(value_series.shift()).cumsum()
    within_group_idx = value_series.groupby(group_ids).cumcount() + 1
    
    # 保留最多连续2个相同值的行
    filtered_df = df[within_group_idx <= 2]
    
    # 检测索引断裂的位置,生成拆分分组标签
    # 索引差大于1说明中间有被删除的行(缺口),以此作为拆分依据
    split_groups = (filtered_df.index.diff() > 1).cumsum()
    
    # 拆分成多个子DataFrame并返回
    return [sub_df for _, sub_df in filtered_df.groupby(split_groups)]

测试示例

# 构造带时间戳的测试数据
data = {
    'timestamp': pd.date_range(start='2024-01-01', periods=12, freq='H'),
    'value': [1, 3, 3, 5, 6, 6, 6, 7, 4, 5, 5, 1]
}
df = pd.DataFrame(data)

# 处理并拆分
result_dfs = process_time_series(df, 'value')

# 输出结果
for i, sub_df in enumerate(result_dfs):
    print(f"子DataFrame {i+1}:")
    print(sub_df)
    print("---")

输出结果

子DataFrame 1:
           timestamp  value
0 2024-01-01 00:00:00      1
1 2024-01-01 01:00:00      3
2 2024-01-01 02:00:00      3
3 2024-01-01 03:00:00      5
4 2024-01-01 04:00:00      6
5 2024-01-01 05:00:00      6
---
子DataFrame 2:
            timestamp  value
7  2024-01-01 07:00:00      7
8  2024-01-01 08:00:00      4
9  2024-01-01 09:00:00      5
10 2024-01-01 10:00:00      5
11 2024-01-01 11:00:00      1
---

说明

  • 原始数据中连续3个6的第3个被过滤,对应的时间戳2024-01-01 06:00:00形成缺口,拆分后的两个子DataFrame分别对应缺口前后的有效数据;
  • 如果原始数据是Series而非DataFrame,只需调整代码中针对DataFrame的部分,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:57:18