如何为满足条件且连续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)
代码说明
- 类型转换:先确保
Timestamp列是datetime类型,否则无法计算时间差。 - 基础条件标记:用布尔列
meets_condition标记所有满足三个数值条件的行。 - 连续分组:利用
~meets_condition的累积求和,将连续满足条件的行划分为同一个分组,不满足条件的行作为分组分隔。 - 时长计算:对每个分组计算起始和结束时间的差值,筛选出时长≥10秒的有效分组。
- 标记结果:将属于有效分组的行的
bin列设为True,其余为False。
运行后即可得到符合需求的结果,无需严格匹配示例格式,核心是准确标记出连续10秒满足条件的行。
内容的提问来源于stack exchange,提问作者IDK
相关产品推荐
相关产品推荐

