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

Pandas如何标记Start/Finish间行、划分会话并过滤暂停计算耗时

实现方案

前置依赖与示例数据

import pandas as pd
import datetime

# 示例数据生成
actions = ['Start','Action1','Action2','Pause','Actoin2','Resume','Action1','Finish','Start','Action1','Finish']
start_date = datetime.datetime.strptime('14/10/21 09:00:00', '%d/%m/%y %H:%M:%S')
date_list = [start_date + datetime.timedelta(seconds=x) for x in range(0,11)]
values = [1,1,2,1,2,1,5,1,1,1,1]
df = pd.DataFrame({'ActionType': actions,
                   'Timestamp': date_list,
                   'Value': values})

步骤1:生成会话编号

通过匹配Start动作累加计数实现,无循环:

df['Session'] = df['ActionType'].eq('Start').cumsum() - 1

步骤2:计算剔除暂停的实际耗时

通过状态标记+分组累加实现,全矢量化操作适合大数据量:

# 标记暂停、恢复动作
pause_flag = df['ActionType'] == 'Pause'
resume_flag = df['ActionType'] == 'Resume'

# 标记当前行是否处于暂停区间(Pause之后到Resume之前)
df['is_paused'] = (pause_flag.cumsum() - resume_flag.cumsum()).shift(fill_value=0) > 0

# 计算相邻行时间差(秒)
df['time_diff'] = df['Timestamp'].diff().dt.total_seconds().fillna(0)

# 暂停区间的时间差不计入有效耗时
df['valid_diff'] = df['time_diff'].where(~df['is_paused'], 0)

# 每个会话的首行耗时重置为0
df['valid_diff'] = df['valid_diff'].mask(df.groupby('Session').cumcount() == 0, 0)

# 分组累加有效时间得到实际耗时
df['RealTimeElapsed'] = df.groupby('Session')['valid_diff'].cumsum().astype(int)

输出验证

最终输出的Session和RealTimeElapsed和示例完全一致,可根据需求删除中间计算列(is_paused/time_diff/valid_diff)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:36:03