基于接近开关脉冲将时间序列切分为10等份并新增Label列的实现
传感器时间序列区间分块打标签方案
需求描述
- 数据集为包含3个传感器采集结果的时间序列,其中
Sensor_3是检测设备转数的接近开关,设备转速变化时,该传感器输出的脉冲时间间隔会同步变化 - 需将相邻两个脉冲之间的所有采集数据切分为10个大小相等的块,允许块内数据行数无法被10整除
- 最终在原DataFrame中新增
Label列,标记每行数据所属的区间
示例数据
原始输入
Timestamp Sensor_1 Sensor_2 Sensor_3 1636496284130 60.875 35.946 0 1636496284132 58.467 33.889 0 1636496284134 58.668 37.253 0 1636496284136 57.966 30.540 0 1636496284138 56.712 33.254 0
期望输出
Timestamp Sensor_1 Sensor_2 Sensor_3 Label 1636496284130 60.875 35.946 0 A 1636496284132 58.467 33.889 0 A 1636496284134 58.668 37.253 0 A 1636496284136 57.966 30.540 0 A 1636496284138 56.712 33.254 0 A
实现代码(Python + Pandas)
import pandas as pd # 此处df为已经读取到内存的原始数据集DataFrame # 1. 识别脉冲位置,可根据实际脉冲的电平值调整判断条件,此处默认脉冲高电平为1 blip_positions = df[df['Sensor_3'] == 1].index.tolist() # 补充边界索引,覆盖数据首尾的完整区间 blip_positions = [-1] + blip_positions + [df.shape[0]] all_labels = [] for seg_idx in range(len(blip_positions) - 1): seg_start = blip_positions[seg_idx] + 1 seg_end = blip_positions[seg_idx + 1] seg_total_rows = seg_end - seg_start if seg_total_rows <= 0: continue # 为区间内每行分配标签,A-J对应10个分块 for row_offset in range(seg_total_rows): block_num = int(row_offset * 10 / seg_total_rows) all_labels.append(chr(ord('A') + block_num)) # 写入标签列 df['Label'] = all_labels
适配说明
- 若实际数据中
Sensor_3的脉冲触发值不是1,自行调整df['Sensor_3'] == 1的判断条件即可 - 若需要数字格式的标签,将
chr(ord('A') + block_num)替换为block_num + 1,即可生成1-10的数字标签 - 代码自动适配任意长度的脉冲区间,无需手动处理行数不能被10整除的场景
内容的提问来源于stack exchange,提问作者ortunoa
相关产品推荐
相关产品推荐

