智慧农业数据平台系列 · 第三篇 | 清洗与处理
农业数据清洗:传感器跳值、轨迹飘点、台账错填,脏数据怎么洗成可用数据
···
"数据采进来了,领导说先出个看板看看效果。结果墒情数据里混了一堆 999% 的土壤湿度,农机轨迹有几个点飘到了隔壁县,遥感 NDVI 出现负值,种植台账里'水稻'写了三种写法——水稻、稻子、稻谷。一张图打开全是异常,领导问我这数据能用吗,我没法回答。"
上一篇讲了"搬"——把数据从各系统收进临时区。但临时区的数据是原始脏数据,不能直接用。这一篇讲"洗"——怎么把脏数据洗成可用数据。
清洗这事说大不大,说小不小。说大了,数据质量直接决定后面所有分析、看板、预警能不能用。说小了,无非就是挑异常、补缺失、统一格式、对齐口径这几件事。但每一件里都有坑,农业场景尤其多。
一、农业数据脏在哪
先搞清楚敌人是谁。农业项目的脏数据,分六类:
这六类脏数据不是偶发的,是常态。农业物联网设备部署在野外,日晒雨淋,故障率天然比室内设备高。再加上人工填报环节多,出错率就更高。
二、传感器跳值怎么洗
跳值是农业数据里最常见的脏数据。特点很明确:正常范围内的数据突然出现一个明显不合理的值。
第一步:设阈值范围
每个指标都有物理极限。土壤湿度不可能 999%,温度不可能 -99°C。先按指标类型设硬阈值:
注意:硬阈值只拦"明显不合理的值",不拦"不太合理但在范围内的值"。比如土壤湿度 98% 在范围内,但如果之前一直是 40% 突然跳到 98%,这很可能是传感器故障不是真实变化。硬阈值是第一道网,不是唯一的网。
第二步:变化率检测
硬阈值拦不住"在范围内但不合理"的跳值。这时候要看变化率——跟上一个数据点比,变化了多少。
方法:取连续三个数据点,如果中间点跟前后两点的差值超过阈值,判定为跳值。
t-1 土壤湿度 42% → t 土壤湿度 87% → t+1 土壤湿度 43%
t 时刻变化率 = |87-42| / 42 = 107%,远超正常变化(土壤湿度30分钟变化不超过10%),判定为跳值
每种指标的合理变化率不一样:
第三步:跳值处理
检测到跳值后怎么处理?不是简单删掉,而是替换+标记:
- 替换:用前一次有效值替代(最后已知值法),或用前后两点的线性插值
- 标记:加一个
quality_flag 字段,值为 interpolated(插值)或 replaced(替换) - 告警:同一站点24小时内出现3次以上跳值,触发设备故障告警
为什么不直接删掉?删掉会产生时间空洞,时序分析、趋势图都会断。替换+标记既能保持时间连续性,又能在分析时知道哪些是真实值哪些是补的。
三、农机轨迹飘点怎么洗
农机 GPS 轨迹飘点是农业数据清洗里最头疼的问题。跟传感器跳值不同,轨迹飘点不是一个值的异常,是空间位置的异常——一个轨迹点突然跳出几百米外,再跳回来。
飘点的特征
- 跳点:连续两个轨迹点之间距离突然变大(比如30秒内跳了500米,农机不可能这么快)
- 漂移
- 冷启动
清洗四步法
第一步:速度过滤
算相邻两个轨迹点之间的距离÷时间间隔=速度。农机作业速度一般不超过 15 km/h,超过 50 km/h 的轨迹点判定为飘点。
第二步:精度过滤
NMEA 报文里有 HDOP(水平精度因子)和 satellites(卫星数)字段。HDOP > 5 或卫星数 < 4 的点标记为低质量,不删但降权使用。
第三步:轨迹平滑
对剩余轨迹点做卡尔曼滤波或移动平均平滑——不是改变原始数据,而是在分析层用平滑后的轨迹做地块匹配。原始轨迹保留,方便回溯。
第四步:地块匹配+缓冲区
平滑后的轨迹跟地块图斑做空间相交。关键:加缓冲区(buffer 2-3 米)。不加缓冲区的话,地块边界附近的轨迹点稍有偏差就落到隔壁地块。加缓冲区后,落在缓冲区内的轨迹点按距离最近的地块归属。
原始轨迹 → 速度过滤 → 有效轨迹 → 轨迹平滑 → 平滑轨迹 → 地块匹配(buffer 3m) → 作业面积统计
真实坑:某项目农机作业面积统计跟农户自己报的对不上。查了半天发现是缓冲区设太大(10米),把隔壁地块的作业也算进来了。缓冲区一般2-3米够用,别贪大。还要按停留时长过滤——农机在某地块停留超过30秒才算"在该地块作业",否则可能是路过。
四、编码统一怎么洗
同一作物在不同系统里叫不同名字、用不同编码,这个问题在农业项目里100%存在。
洗法不复杂,但必须在建模型之前做——不然数据进了标准层,编码不一致带来的错误会渗透到所有分析结果里。
操作步骤
- 第一步:把所有系统的作物编码/名称全部拉出来,列成一张映射表
- 第二步:映射到 GB/T 35850《农作物分类》国家标准编码
- 第三步:在清洗环节加一个编码转换步骤——数据从临时区进清洗区时,自动查映射表把原始编码替换成国标编码
- 第四步:原始编码不删,存一个
raw_crop_code 字段,方便回溯
真实坑:某县农情调度系统的作物编码前缀"A"代表粮食作物、"B"代表经济作物,但文档里没写。数据抽过来后"水稻"和"油菜"混在一起做统计,全县种植结构分析全错。编码映射表一定要跟业务方确认,不能自己猜。
五、坐标系统一怎么洗
农业项目里至少三套坐标系并存:农机 GPS 用 WGS84,高标准农田图斑用 CGCS2000,有些村台账用的是地方独立坐标系(比如北京54、西安80)。
不同坐标系之间差几十米到上百米。不统一的话,农机轨迹跟地块图斑做空间相交会对不上。
统一到 CGCS2000
国标要求使用 CGCS2000(2000国家大地坐标系),所有数据统一到这个坐标系。
| | |
|---|
| | 农业场景精度要求不高,直接当 CGCS2000 用 |
| | |
| | |
| | |
实操建议:WGS84 和 CGCS2000 的差异在厘米级,农业场景(精度要求米级)直接当同一个用。老数据(北京54/西安80)找当地自然资源局要转换参数,一般都有。实在拿不到的,找地块的已知特征点(道路交叉口、地块拐角)做配准校正。
六、缺失值怎么补
农业物联网设备在野外运行,断电断网是常态。墒情设备太阳能供电,阴雨天电量低自动休眠,夜间也可能不报数据。
缺失值处理策略:
| | |
|---|
| | 用前后两个有效值线性插值,标记 quality_flag=interpolated |
| | 用最后一次有效值填充,标记 quality_flag=last_known |
| | |
| | 标记 quality_flag=missing,数据留空,不做插值。夜间设备休眠导致的缺失是正常的 |
关键原则:补的值必须有标记。分析时可以选择"只用真实值"还是"用补值+标记值",不能让补值跟真实值混在一起分不清。
真实坑:某项目把所有缺失值都用前一次值填充,连续填充了3天的数据。结果干旱预警没触发——因为填充值一直是"正常湿度",实际上设备已经断了3天,真实湿度早就降到预警阈值以下了。超过6小时的缺失不要补值,直接标 missing 让系统知道这里数据断了。
七、遥感云遮挡怎么洗
遥感数据在农业项目里用得越来越多——作物长势监测(NDVI)、种植结构提取、旱情监测都离不开它。但光学遥感有个硬伤:云。
Sentinel-2(哨兵2号)卫星每5天过境一次,但一个月4次过境里,可能2-3次被云挡住。如果直接用单张影像,大面积区域可能是云不是作物。
处理方法:多时相合成
不是用单张影像,而是取一个月内所有无云/少云的影像,逐像素合成——每个像素取这个月内NDVI的中位数或最大值。
Sentinel-2 影像1(8月5日,30%云)
Sentinel-2 影像2(8月10日,60%云)
Sentinel-2 影像3(8月15日,10%云)
Sentinel-2 影像4(8月25日,80%云)
→ 逐像素去云 → 取无云像素NDVI中位数 → 8月合成NDVI
实操关键点:
- 云掩膜:用 Sentinel-2 自带的 SCL(场景分类层)波段,标记云、云阴影、雪像素,剔除
- 合成周期:月度合成够用。如果某个区域某月全是云,合成结果会有空洞,标
no_data - 异常NDVI处理:NDVI 为负值通常是水体或云,不是异常值不要删,标记后按场景处理
- 地块级裁剪:合成完的 NDVI 影像按地块图斑裁剪,算每个地块的平均NDVI,用于作物长势分级
八、清洗规则配置化——别写死在代码里
清洗规则会变。墒情设备换了型号,阈值要调。新增了一种作物,编码映射表要加。发现某个气象站数据持续偏高,校准系数要改。
如果清洗规则写死在代码里,每次改规则都要改代码、重新部署、重新跑全量数据——慢、容易出错、还得开发排期。
正确做法:清洗规则配置化。
改规则只改配置表,不改代码。清洗程序读配置表执行清洗——一套代码跑所有规则,改配置不重启。
九、某县实操案例:清洗前后对比
接上一篇某县的采集案例。数据采进来了,开始清洗。
清洗前数据质量
清洗后数据质量
关键数据:墒情异常率从 8.3% 降到 0.8%,农机飘点率从 15.7% 降到 2.1%,遥感缺失率从 45% 降到 8%。清洗耗时约3周,主要工作量在编码映射表整理和清洗规则调试。
十、清洗阶段踩坑清单
| | |
|---|
| | 硬阈值+变化率检测双保险。硬阈值拦明显异常,变化率拦范围内的突变 |
| | 不删,用插值或最后已知值替代,加 quality_flag 标记。保留原始值方便回溯 |
| | 必须加 buffer 2-3米。不加的话边界附近轨迹点会落到隔壁地块,作业面积统计全错 |
| | 2-3米够用。设10米以上会把隔壁地块作业算进来。配合停留时长过滤"路过不算作业" |
| | 必须跟业务方确认。每个系统的编码规则、前缀含义、枚举值列清楚,让业务方签字确认 |
| | 所有空间数据统一到 CGCS2000。WGS84可直接当CGCS2000用(误差<1米),老坐标系找测绘部门要转换参数 |
| | 超过6小时的缺失不补值,标 missing。防止填充值掩盖设备故障导致的持续异常 |
| | 必须做多时相合成+云掩膜。月度合成取中位数或最大值,别用单张影像 |
| | 规则配置化——阈值、映射、参数、策略全存配置表,改规则不改代码 |
| | 原始数据必须保留在临时区90天。清洗后的数据存清洗区,两套数据并行可追溯 |
| | 清洗完出一份质量报告:各数据源异常率、缺失率、清洗前后对比。让甲方看到清洗效果 |
| | 清洗规则要持续迭代——设备老化阈值要调、新增作物编码要加、季节变化阈值不同(夏季土壤温度上限比冬季高) |
十一、清洗做完的标准是什么
| | |
|---|
| | |
| | |
| | 6小时内缺失值已插值补全并标记,6小时以上缺失标记为missing |
| | 100%作物编码映射到GB/T 35850国标,原始编码保留可回溯 |
| | 100%空间数据使用CGCS2000,非CGCS2000的已做投影转换 |
| | 每条数据带quality_flag字段,标注原始/插值/替换/缺失 |
| | |
| | |
···
数据洗完了,异常率降到2%以下,编码统一了,坐标系统一了,缺失值有标记了。这时候数据才真正可用。
但洗完的数据还是"扁"的——一张大宽表,所有字段堆在一起。要让它好查好用,得按一定结构组织起来。这就是下一篇"整"——数据建模与存储,怎么把清洗后的数据按地块、时间、指标组织成好查的结构。
智慧农业数据平台系列 · 第三篇
上一篇:农业数据采集与汇聚——7种数据源、4种接入方式
下一篇:数据建模与存储——地块级建模、时序建模、空间数据怎么组织