一条没有空值的温度曲线,可能来自连续测量,也可能来自把十分钟断流全部向前填充。下游模型看到的数值相同,证据强度却不同。工业数据工程的目标不是消除每个空格,而是明确每个值从哪里来、代表哪段时间,以及现在能否使用。以下方案适用于低频过程监测与特征构建;高速振动波形另需信号处理设计。所有数值和阈值均为构造示例,未进行现场实测。
先定义测量语义,再确定一分钟一行代表什么
至少为每条记录保留设备、测点、原始事件时间、系统可用时间、数值、单位、质量码和采集批次。事件时间表示测量发生时刻;可用时间表示这条数据何时能够被特征服务读取。设备时钟偏差、重传和晚到都应保留可追溯处理结果,不能用入库时间直接覆盖原时间。
按测点区分瞬时量、区间统计、累计计数与状态。温度均值、用电量增量、累计表读数和开关状态不能套用同一个聚合函数。累计表可以发生复位或换表,差分前需先识别;停机时温度仍有物理意义,但产量为零与产量缺测也不是同一状态。
一分钟一行可以表示该分钟观测值的平均、该时刻最后可信状态,或者经过时间加权的区间平均。这三者含义不同。pandas 的 resample 提供 closed、label 与 origin 等参数,分别涉及桶边界归属、输出标签和分组起点。[1] 把标签写成 10:01,不代表该行天然只包含 10:01 前已经可见的数据。
建议在契约中明确左闭右开或其他区间约定、时区、桶宽、观测截止条件和晚到更新规则。例如 [10:00,10:01) 排除恰好 10:01 的事件。跨设备特征还需约定允许的时钟误差;未经校正的时间对齐,可能把同一物理过程错误排列成先后关系。
构造反例:按行取均值,并不总是按时间取均值
假设温度在一段一分钟区间内,前 50 秒保持 20℃、后 10 秒保持 80℃,且这一分段状态已经由独立记录确认。如果前一段只记录一次、后一段记录十次,按十一条记录取均值得到约 74.55℃;按持续时间加权则为 (20×50+80×10)÷60=30℃。差异来自采样密度,不是算术错误。
真实场景通常没有如此完整的状态知识。单个温度点并不能证明其后一直不变;若采用前值保持来估计时间加权均值,必须说明最大可信持续时间和跨工况边界行为。线性变化假设又会给出另一种积分结果。数据稀疏时,不应把选择的假设描述为已知物理事实。
因此先决定业务关心峰值、区间热负荷还是某时刻状态,再选择特征。区间均值可与最大值、有效观测数量、有效覆盖时长一起保留。仅输出一个均值,会让频繁采样的异常段主导结果,也可能在另一种采样方式下把短时异常稀释掉。
计数覆盖率可定义为固定采样协议下有效收到的预期采样点比例,但对事件触发上传设备通常没有同样的分母。时间覆盖率则是按明确有效期规则被可信观测覆盖的时长占目标时长比例。两者都要说明去重、质量码和停机期间规则,不能从行数多直接推断覆盖完整。
补齐时间轴、插值和降采样是三件不同的事
生成连续时间桶只是建立坐标,不会产生新的测量。聚合把已有观测按规则汇总;插值则根据已有点和假设估计未观测位置。应先确定要保留的原始观测,再估计目标位置,不能让工具默认行为悄悄改变证据集合。
pandas 的 Resampler.interpolate 文档说明,其流程先重建目标时间索引,再对空值插值,并警告非等间隔或高频数据可能因此丢失信息。[2] 例如 00 秒和 60 秒均为 20℃,但 25 秒有一个 80℃观测;若目标网格只有 00、30、60 秒,先仅保留网格位置可能丢掉 25 秒的尖峰,再补出看似平稳的中间值。
若目的是在目标时刻估计温度,可先在原观测与目标时间的并集上,按实际时间差进行受限插值,再选目标时刻;若目的是分钟异常特征,则应直接从原观测计算最大值等统计量。前者也未必保留峰值,所以不能拿插值曲线代替所有特征。保留原始序列和处理版本,才有可能解释差异。
高速波形不能仅靠每隔若干点抽一条来降采样。SciPy 的 resample_poly 使用低通 FIR 滤波配合采样率变换,文档也明确边界外取值假设会影响结果。[3] 低通滤波用于控制混叠,但也改变高频信息;应根据目标频带、设备采样条件和端点处理选方案,而不是照搬慢速温度的补值规则。
用缺口类型和持续时间决定能否补值
先区分短暂传输迟到、真实采集丢失、传感器故障、设备停机和不适用。补传可能恢复真实观测;插值无法恢复已经失去的事实。质量码异常和通信断开应该作为独立状态保留,即使数值字段仍重复上一个读数,也不能自动认定观测有效。
构造策略示例:对已验证缓慢变化的温度,只允许同一稳定工况内不超过 30 秒的短缺口进行估计;超过边界则保留缺失并标记特征不可用。30 秒只是示例,必须依据过程变化速率、告警时限与验证数据确定。高频振动、开关跳变或启停附近的温度,不能沿用这个假设。
向前填充仅依赖过去值,适合有可信有效期的状态保持,但不是无限期使用陈旧读数的许可。双端线性插值依赖缺口之后的点,适合某些离线复盘,不一定适合实时告警。更平滑的曲线也可能恰好抹掉需要检测的跳变。
工具中的 limit 常按连续空值数量计,而不是按真实经过时间;目标频率改变后,相同数值会对应不同跨度。[2] 因此在调用补值函数之外,还应检查左右锚点间隔、距离最近真实观测的时长、是否跨越维护或启停边界,以及整段缺口长度。不要只填长缺口开头几格,然后把它们误标成合格短缺口。
输出建议至少包括原始值或聚合值、估计值、来源标记、锚点时间、缺口总跨度、当前数据年龄和处理规则版本。可用来源标记区分实测、聚合、前值保持、双端插值和不可用。下游应同时接收质量信息;仅增加一列缺失标记,却在评分时忽略它,仍不能证明稳健。
实时视图与事后修订视图应分开保存
假设 10:00 需要生成一个特征,只有 09:59 的 20℃已到达,而 10:01 的 40℃要到 10:02 才收到。事后用双端插值可构造 10:00 的 30℃,但在真实 10:00 决策时它并不存在。把这种修订值写回历史线上输入,会让模型评估提前看到未来。
实时视图只使用截止时刻已可用的观测,并按约定决定等待、使用限期旧值、降级或拒绝生成。离线修订视图可以纳入后来的真实观测与允许的估计,但需要独立版本和修订时间,不能覆盖当时送入模型的输入快照。
本文聚焦重采样和缺测的输入语义;完整模型评价还需结合时间序列回测中的数据可见时间与重训节奏,保证训练、预测和评分使用各自允许的信息。离线填补后的高完整率不能作为线上数据可用率。
降级路径应具体到任务。可对部分非关键缺测输出带质量标记的结果,对关键测点断流暂停该模型的自动判断并交由既有规则或人工处理。不要把无结果自动记为正常,也不要让数据工程逻辑擅自替代设备安全保护。
验收用反例检查信息是否被改变
先建立固定反例集:桶边界点、非网格尖峰、连续长缺口、乱序补传、重复时间戳、单位切换、表计复位和启停切换。为每个例子手工规定允许进入哪个桶、是否允许估计、应该保存哪些质量标记。重复时间戳若数值冲突,应依据来源与修订规则处理,不能随意取最后一行。
再在有可信完整观测的保留区间遮蔽部分数据,比较不补值、受限前值保持和受限插值。既模拟随机丢点,也模拟连续断流及异常附近缺测。遮蔽实验只能验证构造缺失下的重建能力,不能证明真实故障缺失具有同样分布;故障期间没有真值的区间应另列限制。
报告被遮蔽点上的原单位绝对误差、峰值保留、阈值事件是否改变,以及超过允许缺口仍被自动使用的次数。若使用最大值特征,峰值检查应针对原窗口极值;若是状态特征,则检查切换时刻。不能用一种平均误差替代所有业务目标。
将误差按缺口时长、工况、测点类型和估计方法拆开,同时报告模型实际可用覆盖率和降级比例。宽松补值可能提高可用率,却放大错误自信;严格拒用会增加人工负担。验收应对这两个代价共同设限,阈值由任务后果决定。
最后冻结采样契约、原始快照、时钟处理、补值规则、软件版本与反例预期结果。本文核对的是 pandas 3.0.6 与 SciPy 1.18.0 在线文档所述行为;实际部署应锁定自身版本并复核。可以交付整洁的数据表,但更重要的是让每个估计值都能被识别、解释和拒用。
