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

Pandas高效实现:合并列中连续重复值的行并支持时间阈值

高效合并生产线中断事件DataFrame的向量化方案

针对同一中断原因(RSNNAME)的连续事件被拆分为多行的问题,我们可以用pandas的向量化操作替代iterrows循环,大幅提升处理效率,同时支持15分钟的时间间隔阈值判断。以下是具体实现步骤:

前置准备

首先确保时间列是datetime类型,并按中断原因和时间排序(保证连续事件的时序正确性):

import pandas as pd

# 转换时间列为datetime类型
df['BEGTIME'] = pd.to_datetime(df['BEGTIME'])
df['ENDTIME'] = pd.to_datetime(df['ENDTIME'])

# 按中断原因、开始时间排序,确保事件按时间顺序排列
df = df.sort_values(by=['RSNNAME', 'BEGTIME'])

生成事件分组标识

通过向量化计算,给需要合并的连续事件分配同一组ID:

# 按RSNNAME分组,计算当前事件开始时间与上一事件结束时间的间隔
df['interval'] = df.groupby('RSNNAME')['BEGTIME'] - df.groupby('RSNNAME')['ENDTIME'].shift(1)

# 标记新事件组:间隔超过15分钟,或为组内第一个事件(间隔为NaN)
df['new_group'] = (df['interval'] > pd.Timedelta(minutes=15)) | df['interval'].isna()

# 按RSNNAME分组累加新组标记,生成唯一组ID
df['group_id'] = df.groupby('RSNNAME')['new_group'].cumsum()

按组聚合合并事件

最后按RSNNAME和group_id聚合,取每组的首行开始时间、末行结束时间:

# 聚合生成合并后的事件数据
merged_df = df.groupby(['RSNNAME', 'group_id']).agg(
    BEGTIME=('BEGTIME', 'first'),
    ENDTIME=('ENDTIME', 'last')
).reset_index(drop=True)

方案优势

整个流程完全基于pandas的内置向量化操作,避免了逐行迭代的低效问题。在大数据量场景下(如十万级以上数据),处理速度比iterrows快数十倍甚至上百倍,同时代码简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:45:43