3. 水位数据预处理实战
等水位线绘制的精度,首先取决于进入绘图环节的水位数据质量。野外采集的水位记录往往来自不同时间、不同井、不同测量方式,甚至不同高程基准,直接投入插值会得到扭曲的等值线。本节围绕四件事展开:把明显不可信的异常值找出来并处理掉,把缺失的观测补成可用值,把所有水位统一到同一高程基准,最后整理成一张字段规范、可直接进入绘图流程的数据表。
一、异常值的识别:先定判据,再动手删
异常值不等于错误值。水位出现突变,可能是仪器故障、读数记录错误,也可能是真实的抽水、回灌或降雨响应。因此识别异常值不能只看“数值大不大”,而要结合时间序列的连续性和空间上的邻井关系。实践中常用的判据有三类。
第一类是物理合理性判据:水位埋深不应为负值(除非是承压水自流井并已注明),水位不应高于地面高程过多,也不应低于井底高程。这类越界值可直接判为错误。
第二类是统计判据:对同一井的长时间序列,用中位数和四分位距(IQR)建立稳健区间。设某井多年水位埋深序列的中位数为 M,四分位距为 IQR,则落在 [M−1.5×IQR, M+1.5×IQR] 之外的点标记为可疑。用中位数而非均值,是因为均值本身会被异常值拉偏。
第三类是空间一致性判据:同一含水层、相距不远的井,水位应大致连续变化。若某井水位比周围邻井高出或低出数米且无抽水、回灌等解释,应重点核查。
下面是一段可直接参考的 Python 处理示例,对单井序列做 IQR 标记并输出可疑记录:
import pandas as pd
df = pd.read_csv("well_level.csv") # 字段: well_id, date, depth_m, ground_elev
def flag_outlier(g):
q1, q3 = g["depth_m"].quantile([0.25, 0.75])
iqr = q3 - q1
lo, hi = q1 - 1.5*iqr, q3 + 1.5*iqr
g["suspect"] = ~g["depth_m"].between(lo, hi)
return g
df = df.groupby("well_id", group_keys=False).apply(flag_outlier)
print(df[df["suspect"]][["well_id","date","depth_m"]])
标记出来的点不要一律删除。正确做法是逐条回查原始记录:若是录入错误(如小数点错位、正负号颠倒),直接修正;若是仪器故障导致的孤立跳变,剔除该点并记为缺失;若确为抽水试验等真实事件,应保留并在备注中说明,绘图时单独考虑。剔除后必须在数据表中留下处理痕迹,而不是悄悄改数。
二、缺失值插补:按缺测时长选方法
缺失分两种:原本未观测造成的空缺,以及上一步剔除异常值后形成的空缺。插补方法应与缺测时长和观测频率匹配。
- 短缺口(1~2 个观测间隔):线性内插即可,前后两点连直线取中间值,简单且不易引入偏差。
- 中等缺口(数天至数周):优先用同井相邻时段的水位变化趋势外推,或建立与邻井的回归关系插补。邻井需处于同一含水层、距离较近、无强开采干扰。
- 长缺口或整段缺失:不宜强行插补。若该井对等水位线形态影响大,应标注为“缺测”,在插值时降低其权重或不参与该时段绘制。
插补值必须与实测值区分标记。建议在表中增设 value_type 字段,取值 measured、interpolated、estimated,绘图和成果审查时可追溯。
三、水位统一基准转换:把“埋深”变成“高程”
这是最容易出错、也最影响等水位线形态的一步。野外记录常是水位埋深(地面到水面的距离),而等水位线绘制需要的是水位高程(统一高程基准下的水面标高)。二者关系为:
水位高程 = 地面高程 − 水位埋深
其中地面高程必须来自统一的高程基准。若部分井的坐标和高程来自 1985 国家高程基准,另一部分来自地方独立基准或 GPS 实测椭球高,必须先统一。椭球高转正常高需减去高程异常值,这一步不能省略,否则不同基准的井之间会出现系统性偏差,等值线在基准交界处会出现不合理的密集或扭曲。
此外还要注意时间基准统一:不同井的观测日期不同,若含水层水位季节性波动明显,应尽量选取同一时段(如同一枯水期)的观测值,或统一换算到同一代表时刻。下面给出基准转换与字段整理的核心代码:
# 统一到 1985 国家高程基准,并计算水位高程
df["water_elev"] = df["ground_elev"] - df["depth_m"]
# 若某批井原为椭球高,先扣除高程异常(示例值,实际按测区取)
mask = df["datum"] == "ellipsoid"
df.loc[mask, "ground_elev"] = df.loc[mask, "ground_elev"] - df.loc[mask, "undulation"]
df["water_elev"] = df["ground_elev"] - df["depth_m"]
四、数据表格规范:让下游能直接用
预处理完成后,应输出一张字段固定、单位明确、可追溯的数据表。推荐字段如下:井号、横坐标、纵坐标、坐标系统、地面高程、高程基准、观测日期、水位埋深、水位高程、数据类型、备注。坐标必须注明投影带或地理坐标系,高程必须注明基准,单位统一为米。
整理后的数据表应满足:每行一条观测记录,无重复井号与日期组合;水位高程列全部为数值,缺失处留空并注明原因;坐标、高程、日期三列的单位与基准在表头或元数据中写明。建议在交付前做三项自检:一是抽查若干井,用“地面高程 − 埋深”手工复算水位高程是否一致;二是检查水位高程的空间分布是否连续,有无孤立高值或低值;三是确认数据类型字段中插补值占比,若某井插补比例过高,应在成果说明中提示其可靠性较低。
完成上述四步后,数据表即可进入插值与等值线绘制环节。此时水位高程已统一基准、异常值已处理、缺失值已标注,后续无论采用何种插值方法,输入都是干净且可解释的。