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

如何为DataFrame生成标识列:同Unique_ID状态CLOSED超2小时标记为True

实现方法

核心思路是先识别每个ID下连续的CLOSED状态段,再计算每段的时长判断是否满足阈值,整体实现步骤如下:

前置处理

首先确保时间字段为datetime类型,且每个ID下的记录按时间正序排列:

import pandas as pd

# 转换时间列格式
df['Time'] = pd.to_datetime(df['Time'])
# 按ID+时间排序,保证时序正确
df = df.sort_values(by=['Unique_ID', 'Time'], ignore_index=True)

识别连续状态段

给每个ID下的连续相同Status标记相同的段编号:

# 状态发生变化时标记为新的段
df['segment_id'] = df.groupby('Unique_ID')['Status'].transform(
    lambda x: x.ne(x.shift()).cumsum()
)

计算连续段时长并生成flag

# 按ID、状态、段ID分组,计算每段的最大最小时间差
seg_df = df.groupby(['Unique_ID', 'Status', 'segment_id'], as_index=False)['Time'].agg(['min', 'max'])
seg_df['duration_hour'] = (seg_df['max'] - seg_df['min']).dt.total_seconds() / 3600

# 提取所有存在CLOSED状态持续超过2小时的ID
target_ids = seg_df.loc[
    (seg_df['Status'] == 'CLOSED') & (seg_df['duration_hour'] > 2),
    'Unique_ID'
].unique()

# 给原始表打flag,如需布尔类型可去掉.astype(str)
df['flag'] = df['Unique_ID'].isin(target_ids).astype(str)

可选优化

如果仅需要每个ID对应一条flag结果,不需要保留原始明细行,可最后执行:

result = df[['Unique_ID', 'flag']].drop_duplicates()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:48:03