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

如何为满足条件且连续10秒出现的时序数据标记标识列?

如何标记时序数据中连续10秒满足特定条件的行?

原始时序数据

Truck                       Timestamp           b2_v_fult2_tms_err  tm2_b_fault_level_a tm2_b_fault_code_a
0   251_EV01_PB_579_HD_756828   2023-05-01 13:11:48 NaN                 2.0                 30.0                    
1   251_EV01_PB_579_HD_756828   2023-05-01 13:11:51 1.0                 0.0                 0.0                 
2   251_EV01_PB_579_HD_756828   2023-05-01 13:11:52 1.0                 0.0                 0.0                 
3   251_EV01_PB_579_HD_756828   2023-05-01 13:11:53 1.0                 0.0                 0.0                 
4   251_EV01_PB_579_HD_756828   2023-05-01 13:11:54 1.0                 0.0                 0.0                 
5   251_EV01_PB_579_HD_756828   2023-05-01 13:11:55 1.0                 0.0                 0.0                 
6   251_EV01_PB_579_HD_756828   2023-05-01 13:11:56 1.0                 0.0                 0.0                 
7   251_EV01_PB_579_HD_756828   2023-05-01 13:11:57 1.0                 0.0                 0.0                 
8   251_EV01_PB_579_HD_756828   2023-05-01 13:11:58 1.0                 0.0                 0.0                 
9   251_EV01_PB_579_HD_756828   2023-05-01 13:11:59 1.0                 0.0                 0.0                 
10  251_EV01_PB_579_HD_756828   2023-05-01 13:12:00 1.0                 0.0                 0.0                 
11  251_EV01_PB_579_HD_756828   2023-05-01 14:58:05 1.0                 0.0                 0.0                 
12  251_EV01_PB_579_HD_756828   2023-05-01 14:58:10 0.0                 0.0                 0.0                 
13  251_EV01_PB_579_HD_756828   2023-05-01 14:58:11 0.0                 0.0                 0.0                 
14  251_EV01_PB_579_HD_756828   2023-05-01 14:58:15 0.0                 0.0                 0.0                 
15  251_EV01_PB_579_HD_756828   2023-05-01 14:58:16 0.0                 0.0                 0.0                 
16  251_EV01_PB_579_HD_756828   2023-05-01 14:58:20 0.0                 0.0                 0.0                 
17  251_EV01_PB_579_HD_756828   2023-05-01 14:58:21 0.0                 0.0                 0.0                 
18  251_EV01_PB_579_HD_756828   2023-05-01 14:58:26 0.0                 0.0                 0.0                 
19  251_EV01_PB_579_HD_756828   2023-05-01 14:58:27 0.0                 0.0                 0.0                 
20  251_EV01_PB_579_HD_756828   2023-05-01 14:58:31 0.0                 0.0                 0.0                 

需求说明

找出满足b2_v_fult2_tms_err == 1.0、tm2_b_fault_level_a == 0.0、tm2_b_fault_code_a == 0.0的行,创建名为bin的新列:

  • 若这些行连续满足条件的时长达到10秒,对应bin列填True
  • 其余行填False或留空

预期效果示例:

Truck                       Timestamp           b2_v_fult2_tms_err  tm2_b_fault_level_a tm2_b_fault_code_a  bin
0   251_EV01_PB_579_HD_756828   2023-05-01 13:11:48 NaN                 2.0                 30.0                False
1   251_EV01_PB_579_HD_756828   2023-05-01 13:11:51 1.0                 0.0                 0.0                 True
2   251_EV01_PB_579_HD_756828   2023-05-01 13:11:52 1.0                 0.0                 0.0                 True
3   251_EV01_PB_579_HD_756828   2023-05-01 13:11:53 1.0                 0.0                 0.0                 True
4   251_EV01_PB_579_HD_756828   2023-05-01 13:11:54 1.0                 0.0                 0.0                 True
5   251_EV01_PB_579_HD_756828   2023-05-01 13:11:55 1.0                 0.0                 0.0                 True
6   251_EV01_PB_579_HD_756828   2023-05-01 13:11:56 1.0                 0.0                 0.0                 True
7   251_EV01_PB_579_HD_756828   2023-05-01 13:11:57 1.0                 0.0                 0.0                 True
8   251_EV01_PB_579_HD_756828   2023-05-01 13:11:58 1.0                 0.0                 0.0                 True
9   251_EV01_PB_579_HD_756828   2023-05-01 13:11:59 1.0                 0.0                 0.0                 True
10  251_EV01_PB_579_HD_756828   2023-05-01 13:12:00 1.0                 0.0                 0.0                 True
11  251_EV01_PB_579_HD_756828   2023-05-01 14:58:05 1.0                 0.0                 0.0                 False
12  251_EV01_PB_579_HD_756828   2023-05-01 14:58:10 0.0                 0.0                 0.0                 False
13  251_EV01_PB_579_HD_756828   2023-05-01 14:58:11 0.0                 0.0                 0.0                 False
14  251_EV01_PB_579_HD_756828   2023-05-01 14:58:15 0.0                 0.0                 0.0                 False
15  251_EV01_PB_579_HD_756828   2023-05-01 14:58:16 0.0                 0.0                 0.0                 False
16  251_EV01_PB_579_HD_756828   2023-05-01 14:58:20 0.0                 0.0                 0.0                 False
17  251_EV01_PB_579_HD_756828   2023-05-01 14:58:21 0.0                 0.0                 0.0                 False
18  251_EV01_PB_579_HD_756828   2023-05-01 14:58:26 0.0                 0.0                 0.0                 False
19  251_EV01_PB_579_HD_756828   2023-05-01 14:58:27 0.0                 0.0                 0.0                 False
20  251_EV01_PB_579_HD_756828   2023-05-01 14:58:31 0.0                 0.0                 0.0                 False

已尝试的代码

# 筛选满足条件的行
bin1_df = results_df.loc[(results_df['b2_v_fult2_tms_err'] == 1.0) & 
                         (results_df['tm2_b_fault_level_a'] == 0.0) & 
                         (results_df['tm2_b_fault_code_a'] == 0.0) ].reset_index(drop=True)

# 计算时间差
bin1_df['time_diff'] = bin1_df['Timestamp'].diff()

# 尝试筛选连续1秒的行,但未解决问题
m = bin1_df['time_diff'] == pd.Timedelta(seconds=1)
bin1_df = bin1_df[m.shift(-1)|m]

解决方案

要实现需求,需要先标记满足基础条件的行,再按连续满足条件的片段分组计算时长,最后标记符合时长要求的行。完整代码如下:

import pandas as pd

# 确保Timestamp是datetime类型
results_df['Timestamp'] = pd.to_datetime(results_df['Timestamp'])

# 1. 标记满足基础条件的行
results_df['meets_condition'] = (results_df['b2_v_fult2_tms_err'] == 1.0) & \
                                (results_df['tm2_b_fault_level_a'] == 0.0) & \
                                (results_df['tm2_b_fault_code_a'] == 0.0)

# 2. 按连续满足条件的片段分组(不满足条件的行作为分隔符)
results_df['group_id'] = (~results_df['meets_condition']).cumsum()

# 3. 对每个分组计算连续时长:分组内最后一条时间 - 第一条时间
group_durations = results_df.groupby('group_id').agg(
    start_time=('Timestamp', 'first'),
    end_time=('Timestamp', 'last'),
    meets_condition=('meets_condition', 'first')
).assign(duration=lambda x: x['end_time'] - x['start_time'])

# 筛选出时长≥10秒且满足基础条件的分组
valid_groups = group_durations[(group_durations['meets_condition']) & 
                               (group_durations['duration'] >= pd.Timedelta(seconds=10))]['group_id']

# 4. 创建bin列:属于有效分组的行标记为True,其余为False
results_df['bin'] = results_df['group_id'].isin(valid_groups)

# 可选:删除中间辅助列
results_df = results_df.drop(['meets_condition', 'group_id'], axis=1)

代码说明

  1. 类型转换:先确保Timestamp列是datetime类型,否则无法计算时间差。
  2. 基础条件标记:用布尔列meets_condition标记所有满足三个数值条件的行。
  3. 连续分组:利用~meets_condition的累积求和,将连续满足条件的行划分为同一个分组,不满足条件的行作为分组分隔。
  4. 时长计算:对每个分组计算起始和结束时间的差值,筛选出时长≥10秒的有效分组。
  5. 标记结果:将属于有效分组的行的bin列设为True,其余为False。

运行后即可得到符合需求的结果,无需严格匹配示例格式,核心是准确标记出连续10秒满足条件的行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:45:53