2. 农业气象时序数据采集与预处理实战

农田气象站是农业气象时序分析的数据源头。一个典型的自动气象站通常包含空气温湿度传感器、风速风向传感器、翻斗式雨量计、总辐射表、土壤温湿度探头等,采集器按固定周期(如10分钟或30分钟)轮询各通道,将瞬时值或区间统计值写入本地存储并上传云端。理解采集原理,是判断后续数据质量问题的前提。

以翻斗式雨量计为例:每承接0.2 mm降水,翻斗翻转一次并触发一个干簧管脉冲,采集器对脉冲计数,乘以0.2 mm即得该时段降水量。这意味着雨量数据本质上是"计数累加"而非连续采样,一旦通信中断,丢失的是整段累计量,无法通过插值恢复。而温度传感器多为模拟电压或数字总线输出,采集器在整点前若干秒内多次采样取平均,属于"瞬时统计"型数据。两类数据的缺失处理策略因此不同——这是本节需要建立的核心认识。

缺失值的识别与处理

真实农田数据中,缺失常以三种形式出现:空值(NULL)、哨兵值(如-9999、-99)、以及时间戳断档(记录直接消失)。前两种可在读取时统一替换为缺失标记,第三种必须通过重采样重建时间索引才能暴露。处理策略上,短时缺失(如连续1~3个10分钟间隔)可用线性插值或前向填充;较长的温度缺失可用同日同时刻均值或相邻站点回归填补;而降水缺失不宜插值,应标记为缺失并在统计时排除,否则会系统性低估降水量。

import pandas as pd, numpy as np
df = pd.read_csv("station_2023.csv", parse_dates=["time"])
df = df.set_index("time").sort_index()
df = df.replace([-9999, -99], np.nan)          # 哨兵值转缺失
full = pd.date_range(df.index.min(), df.index.max(), freq="10min")
df = df.reindex(full)                           # 重建时间索引,暴露断档
df["air_temp"] = df["air_temp"].interpolate(limit=3)   # 仅补短缺口
df["rain"] = df["rain"].fillna(0) if False else df["rain"]  # 降水不插值

异常值的判定

异常值来源包括传感器故障、结露、遮挡、电磁干扰和动物触碰。判定应结合物理阈值与统计规则:气温超出-40~60 ℃、相对湿度超出0~100%、风速为负值,均属硬性越界;统计上可用3σ准则或IQR法识别离群点,但对降水这类强偏态分布不宜用σ法。更稳健的做法是"变化率检验":10分钟内气温突变超过5 ℃、或湿度在无降水时突变超过30%,往往指向传感器异常而非真实天气过程。识别出的异常值应先置为缺失,再按缺失策略处理,而不是直接删除整条记录。

时间对齐与重采样

多传感器数据常存在时间戳不一致:温度每10分钟记录一次,土壤水分每30分钟一次,雨量为事件触发记录。分析前需统一到同一时间网格。向上聚合(10分钟→小时)时,温度取均值、降水取求和、风速取均值并另存最大值;向下细化(小时→10分钟)只对温度等连续量做插值,降水量不可拆分。重采样时须注意时间标签约定:resample("1H", label="right", closed="right")表示区间右端点为标签,与"整点时刻代表前一小时"的业务习惯一致,全文应保持同一约定。

农田气象站数据采集与预处理链路 传感器与采集器 温湿度:10min 均值 风速:10min 均值/最大 雨量:翻斗脉冲×0.2mm 辐射:10min 累计 土壤水分:30min 采样 原始数据问题 · 空值 / -9999 哨兵 · 时间戳断档 · 越界与突变异常 · 多源时间不对齐 · 量纲差异大 清洗与对齐 ① 哨兵值→NaN ② reindex 重建网格 ③ 阈值+变化率判异常 ④ 短缺口插值/长缺口标记 ⑤ 重采样统一到1小时 标准化输出 温度:Z-score 湿度:0~1 归一 风速:log 变换 降水:保留原值 输出:分析用宽表 10 分钟数据 → 1 小时重采样规则(示例) 10:00 10:10 10:20 10:30 10:40 21.3 21.8 22.4 22.9 23.1 温度 mean = 22.3 ℃ 风速 mean / max 分别保存 降水 sum = 0.6 mm 时间标签约定:label="right", closed="right" → 11:00 标签代表 10:00–11:00 区间,全文统一

数据标准化

不同要素量纲差异悬殊:气温约20 ℃、风速约3 m/s、辐射可达800 W/m²、降水常为0。若直接送入回归或聚类模型,辐射会主导距离计算。常用做法是对温度做Z-score标准化(减均值除标准差),对湿度做0~1归一化,对风速做对数变换以压缩右偏,而降水量因零值占比高、分布强偏态,通常保留原值或转为"有雨/无雨"二值特征,不做标准化。标准化参数必须只用训练期数据估计,再应用到验证期,避免信息泄漏。

一次完整的预处理任务

假设某站2023年生长季数据共约26000条10分钟记录,经检查发现:雨量通道有连续2天断档、气温存在3处-9999、土壤水分每30分钟一条。处理顺序应为:先替换哨兵值并重建10分钟索引,再按物理阈值与变化率标记异常,短缺口插值、长缺口保留缺失标记,随后将各要素重采样到1小时网格(温度均值、降水求和、风速均值与最大值),最后对温度、湿度、风速分别标准化并合并为宽表。完成后应核对:每小时记录数是否完整、降水日累计是否与雨量计读数一致、标准化后均值是否接近0、标准差是否接近1。这些检查点能有效发现对齐错误或标准化参数误用。

预处理不是一次性动作。建议把清洗规则写成可复用的函数或配置文件,每次新数据入库自动执行,并保留原始数据副本与处理日志,便于回溯异常判定依据。