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
相关产品推荐
相关产品推荐

