如何基于DateTime条件实现传感器读数超10分钟低于阈值的故障检测
传感器读数故障检测代码完善方案
需求梳理
- 标记所有低于550的传感器读数
- 当
sensor_1读数持续低于550超过10分钟时,打印对应记录的filename列值 - DateTime字段每秒生成8条传感器数据
完善后的代码
import pandas as pd # 先确保DateTime列是datetime类型,否则无法计算时间差 df['DateTime'] = pd.to_datetime(df['DateTime']) # 按filename分组,逐个处理每个文件的传感器数据 for filename, group_df in df.groupby('filename'): # 标记所有低于550的sensor_1读数 group_df['is_low'] = group_df['sensor_1'] < 550 # 用累计求和的方式,把连续的低读数划分为同一个分组 group_df['low_group'] = (~group_df['is_low']).cumsum() # 筛选出所有低读数的分组,逐个判断持续时间 low_groups = group_df[group_df['is_low']].groupby('low_group') for _, low_segment in low_groups: # 计算该段低读数的时间跨度 duration = low_segment['DateTime'].max() - low_segment['DateTime'].min() # 判断是否超过10分钟(600秒) if duration.total_seconds() > 600: print(filename) break # 同一个文件只要有一次符合条件就停止判断,避免重复打印
代码说明
- 类型转换:将
DateTime转为datetime类型,保证时间差计算的准确性 - 低读数标记:新增
is_low列,直观标记所有sensor_1低于阈值的记录 - 连续区间分组:通过反向标记的累计求和,自动划分出连续的低读数区间
- 时长判断:对每个连续低读数区间计算首尾时间差,超过10分钟则输出对应文件名
- 按文件独立检测:通过
groupby('filename')确保每个文件的检测逻辑独立,不会跨文件误判
如果你的df是多个DataFrame组成的列表(比如从多个文件读取的数据集),可以改用以下写法:
import pandas as pd for dataframe in df_list: dataframe['DateTime'] = pd.to_datetime(dataframe['DateTime']) dataframe['is_low'] = dataframe['sensor_1'] < 550 dataframe['low_group'] = (~dataframe['is_low']).cumsum() low_groups = dataframe[dataframe['is_low']].groupby('low_group') for _, low_segment in low_groups: duration = low_segment['DateTime'].max() - low_segment['DateTime'].min() if duration.total_seconds() > 600: print(dataframe['filename'].iloc[0]) break
内容的提问来源于stack exchange,提问作者MuhammedSyed21
相关产品推荐
相关产品推荐

