做水文、环境或者地质研究的朋友,手里最缺的往往不是模型和方法,而是干净、连续、时间跨度足够长的实测数据。尤其是在区域地下水评价、生态需水核算这类工作里,一份覆盖全国的日尺度地下水水位数据简直是刚需。这份《全国11897个地下水动态监测站点2005-2021年日尺度地下水水位数据》(EXCEL格式)恰好补齐了这个短板,它把全国上万个国家级监测井的逐日埋深记录整理成了可直接用Excel打开、用Python批量处理的表格,省去了去各省水文局来回沟通、手动拼接纸质年鉴的功夫。对搞水文地质的科研人员、做环境影响评价的工程师、写毕业论文的相关专业学生来说,这绝对是能提升效率的“基础弹药”。下面我会从数据内涵、整理思路、实操处理到典型问题,把这个数据集彻底拆开聊一遍。
1. 数据概况:11897个站点到底意味着什么
先明确一件事:这份数据的核心字段是“地下水埋深”,也就是地面到地下水自由水面的垂直距离,单位通常是米。它跟“水位标高”不一样——埋深是相对地面的深度,水位标高是绝对高程,两者差一个地面高程值。数据里如果只给了埋深而没给地面高程,遇到需要做等水位线图、算水力梯度这类绝对高程分析时,就得另外找DEM或者站点高程数据来换算。
1.1 站点空间分布与时间跨度解读
11897个国家地下水监测站点,基本覆盖了全国主要平原盆地和地下水开采区,比如黄淮海平原、三江平原、长江中下游、关中盆地、四川盆地这些水文地质单元的重点区域都有布点。时间跨度2005到2021年,意味着包含了“十一五”到“十四五”初期的完整序列,这个时段正好覆盖了北方地区地下水超采治理、南水北调通水后水源置换等重大水文事件,做趋势分析非常有价值。
日尺度是这份数据最核心的卖点。要知道,很多公开渠道能拿到的地下水资料是月尺度或年尺度的,日尺度数据对刻画降水入渗补给、开采水位降深、河渠渗漏补给这类高时间分辨率过程至关重要。比如你想算一场台风降雨对平原区地下水的补给响应时间,月尺度数据完全没法用,日尺度就能清楚看到水位在雨后3到5天内的抬升峰值和回落过程。
1.2 文件内容与字段结构的常见设定
EXCEL格式的数据集,拆开来看一般包含以下几类工作表或者字段,拿到手先别急着跑统计,先把字段结构核对清楚:
| 字段类型 | 字段名示例 | 说明 |
|---|---|---|
| 标识信息 | 省、市、县、监测井编号 | 用于行政区域筛选和空间定位 |
| 空间坐标 | 经度、纬度 | 一般用WGS84或CGCS2000坐标系,做GIS叠加前需要确认 |
| 井属性 | 井深、含水层类型、建井日期 | 用于判定数据代表的含水层组,区分浅层、深层 |
| 时间字段 | 监测日期 | 注意EXCEL里日期格式可能存在“2021/1/1”和“2021-01-01”混用的情况 |
| 水位字段 | 地下水埋深(m) | 核心数值字段,注意负值代表什么含义 |
| 附加字段 | 水位标高、水温、备注 | 部分数据会附带,做质量校验很有用 |
我自己拿到这类数据时,一般第一步就是按“省份+年份”建透视表,看每个站点的数据连续性。因为国家监测站虽然名义上从2005年开始,但站点加密是逐步推进的,早期很多站点月序列有缺测,有的站2008年才建井,有的站2015年才接入自动监测设备,如果不提前筛查,后面做时序分析容易踩坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么Excel格式反而比Shapefile或NetCDF更好用
很多人看到“EXCEL格式”会觉得不够专业,嫌它不是GeoTIFF或者NetCDF。我反而是持相反态度:对于地下水埋深这种“井点+时间序列”的数据结构,Excel(或者说表格型CSV)恰恰是最灵活、最不容易出错的交换格式。
2.1 表格结构对非专业用户的友好性
水文地质从业者并不全是编程高手,很多做水资源论证、环评的工程师日常工具就是Excel。11897个站点如果打包成NetCDF那种多维数组格式,文件是小了、读取是快,但你要让一个用惯了数据透视表的工程师把它拆出来看某个县的井水位,学习成本就太高了。Excel格式可以直接用筛选、透视表、条件格式完成初步探索,比如选出某个市的所有站点,看看2005到2021年的埋深趋势,整个过程不需要写一行代码。
我实测下来,在Excel里建一个数据透视表,行放监测日期,列放监测井编号,值取地下水埋深平均值,几分钟就能看出区域水位整体变化格局。如果数据是NetCDF,这活干起来就要费半天。对绝大多数实际业务场景来说,先会用Excel把数据“看懂”,比直接用复杂格式“算”更重要。
2.2 与其他地理数据格式的互转路径
表格格式转其他专业格式非常顺畅。做GIS分析时,把经纬度和埋深字段另存为CSV,在ArcMap或QGIS里“Display XY Data”直接就能生成点图层,再通过“Point to Raster”插值成栅格水面埋深图。做数值模拟时,写个小脚本把Excel转成MODFLOW的井点输入文件也不复杂。
反过来,如果原始数据是Shapefile站点文件,你反而需要把属性表导出再转成表格才能做时间序列分析,多一道工序。所以我的判断是:Excel在“分发交换”这个环节的通用性是碾压级的,越是对数据格式不设限的团队,协作效率越高。
3. 数据预处理:拿到手第一步先做这几件事
数据落到手里,千万别直接拖到SPSS里跑回归。国家级站点的数据虽然质量相对可靠,但自动监测仪器漂移、人工监测校核、极端天气导致缺测,都会在序列里留下痕迹。以下是我处理这份数据时的标准流程。
3.1 日期格式统一与时间序列补全
EXCEL打开日尺度数据最常见的坑是日期识别错乱。比如原始数据里的日期是文本格式“2005/1/5”,在Excel里可能被识别成“2005年1月5日”,但复制到新表时有的会变成一串数字“38362”。这是因为Excel把日期存储成了从1900年1月1日起算的序列数。
碰到这种情况,我的处理方式是:拿到文件后先在Excel里选中日期列,设置单元格格式为“日期”,看它是否正常显示。如果显示为数字,用“数据→分列→日期格式”强制转换。如果数据量大,直接上Python更省事,下面这段代码用pandas批量处理日期序列数转标准时间:
python复制import pandas as pd
df = pd.read_excel("groundwater_daily.xlsx", sheet_name="2005", dtype={"监测日期": str})
# 情况一:日期列是Excel序列数,例如38362
def excel_serial_to_date(serial):
if serial.replace(".", "").isdigit():
return pd.Timestamp("1899-12-30") + pd.Timedelta(days=float(serial))
return pd.to_datetime(serial, errors="coerce")
df["标准化日期"] = df["监测日期"].apply(excel_serial_to_date)
print(df["标准化日期"].head())
print(df["标准化日期"].isna().sum())
这段代码里用“1899-12-30”作为起点而不是“1900-01-01”,是因为Excel的日期序列存在一个著名的闰年bug,实际计算时从1899-12-30算起才能保证序列数转出来的日期跟Excel界面显示一致,这个小细节能避免后续日期偏移一天的误差。
统一日期之后,还要检查连续性和缺测情况。日尺度数据最怕的就是中间断档还浑然不觉。我会按站点分组,统计每个站点2005到2021年间有效记录的天数,和理论天数做对比:
python复制grouped = df.groupby("监测井编号")["标准化日期"]
coverage = grouped.agg(有效天数="count", 起始日期="min", 截止日期="max")
coverage["理论天数"] = (coverage["截止日期"] - coverage["起始日期"]).dt.days + 1
coverage["完整率"] = coverage["有效天数"] / coverage["理论天数"]
print(coverage["完整率"].describe())
这份数据里完整率大于95%的站点大概占多少,我处理时没有全量统计,但经验上一批国家站能到80%到85%的完整率就很好了。完整率低于70%的站点,做连续过程线分析时要特别小心,缺测导致的虚假波动幅度往往比真实信号还大。
3.2 埋深数据异常值识别与处理原则
地下水埋深的物理约束非常明确:埋深不可能小于零(除非是自流井溢出地面,那种会有专门备注),不可能大于井深,日际变化在非开采期也不可能出现十几米的跳跃。这三个约束可以直接用来写清洗规则。
我见过最多的异常类型是“台阶式突变”,即某个站点前后两天的埋深从12米直接跳到7米,随后又稳定。这种通常不是水位真的涨了,而是监测手段换了,比如人工测绳改成自动水位计,或者仪器零点标定调整过。处理原则是宁保守勿激进:如果站点备注里没有说明人工或设备变更,我不建议随意“修正”这些跳变,但做趋势分析时可以对这些站点单独打标记,避免它们影响区域统计。
还有一类是“零值”,有的站点数据里会夹着0米埋深,这在水位埋深物理意义上非常可疑(除非井口被淹没了),大概率是仪器空采或信号丢失后由系统填充的默认值。清洗时我一般直接设为缺失值。
下面列一份我实测中总结的异常值判定速查表,可以直接拿来当参考标准使用:
| 异常类型 | 判定条件 | 建议处理方式 |
|---|---|---|
| 负埋深 | 埋深 < 0 | 核对备注中是否有自流井信息,无备注则剔除 |
| 超井深 | 埋深 > 井深 | 直接剔除,属于明显的设备故障数据 |
| 日突变超大 | 相邻两天埋深变化 > 8米 | 先查是否取错监测孔,无解释则剔除突变点 |
| 长期零值 | 连续30天埋深恒为0 | 视为传感器故障,整段剔除 |
| 突然整体抬升 | 日埋深整体抬升/下降且长期稳定 | 视为设备换型或人工改测,保留但打标 |
清洗之后,再画单站水位过程线,基本就能看出地下水动态的本质规律了。有些站呈现“夏降冬升”的农灌开采型波动,有些站呈现“缓慢下降+雨季脉冲回升”的态势,这些形态直接对应区域的含水层类型和补给机制,是做进一步分析前非常有价值的概化信息。
4. 全国尺度动态分析:从单站曲线到区域评价
数据清洗完之后,就进入真正有意思的阶段了。这份数据的价值不在于单站点的水位读数,而在于它能把全国地下水的变化格局串起来。
4.1 年内变幅与多年趋势的分级统计
我拿到这份数据后,第一个动手的方向是算每个站点2005-2021年间的多年平均埋深、年内最大变幅和线性趋势。这里有一个非常关键的口径问题:埋深是“越大说明水位越低”,所以线性趋势的斜率如果是正的(埋深逐年增大),说明水位在持续下降,这是典型的超采信号;斜率为负则说明水位在回升。
用Python处理的话,推荐用SciPy的linregress对每个站点的年度平均埋深做线性拟合:
python复制from scipy import stats
import numpy as np
trend_results = []
for well_id, grp in clean_df.groupby("监测井编号"):
yearly_mean = grp.set_index("标准化日期").resample("Y")["地下水埋深"].mean().dropna()
if len(yearly_mean) < 5:
continue
slope, intercept, r_value, p_value, std_err = stats.linregress(
np.arange(len(yearly_mean)), yearly_mean.values
)
trend_results.append({
"监测井编号": well_id,
"斜率_m/年": slope,
"趋势显著性": p_value,
"多年平均埋深": yearly_mean.mean()
})
trend_df = pd.DataFrame(trend_results)
# 统计水位下降站点占比(斜率 > 0)
down_wells = trend_df[trend_df["斜率_m/年"] > 0]
print(f"埋深增大(水位下降)站点占比: {len(down_wells) / len(trend_df):.1%}")
这个统计输出给我的经验是:北方平原区的下降趋势站点占比通常明显高于南方,其中一个核心原因是北方农业开采规模大,浅层地下水更新速率跟不上开采强度。
但是我得提醒一句:单站线性趋势的水文意义非常有限,因为地下水位的年际波动受降水和开采的双重驱动,典型的波动周期可能长达5到10年。比如2010到2015年可能因为丰水期出现短暂回升,2016到2020年又重新进入下降期,用单纯的线性趋势很容易得出“大幅回升”或“持续下降”的偏颇结论。更稳妥的做法是计算5年滑动平均,或者做Mann-Kendall趋势检验,同时看站点在2005-2010、2010-2015、2015-2021三个时段的趋势转折情况。
4.2 地下水位动态类型划分:揭示区域水文地质规律
单站数据做完,下一步就是区域视角的动态类型划分。这是一个非常经典但极度依赖日尺度数据的分析,月尺度数据虽然也能做,但会丢失很多细节。
我在实际项目中常用的划分逻辑是:以月份为单位,计算每个站点的多年平均月埋深过程线,然后看波峰波谷出现的季节和幅度,把动态类型归为几类:
- 开采-蒸发型:年内埋深最小值出现在雨季前(3-5月),最大埋深出现在秋冬季或灌溉高峰后,典型于北方井灌区,表现为明显的“V”型或“W”型曲线。
- 降水入渗型:埋深最小值出现在雨季后(9-10月),雨季降水补给迅速抬升水位,年内变幅不大,典型于南方丘陵区和山前冲洪积扇。
- 径流补给型:曲线相对平缓,受侧向径流补给控制,年内变幅往往小于2米,常见于山前地带和河谷漫滩。
- 长期下降叠加型:在某种年内动态类型的基础上,整体趋势线持续下倾,说明开采量长期超过补给量,这是超采区识别的直接证据。
你可以直接写一个函数,按站计算每个像素点(月份)的标准化埋深,然后聚类(K-Means设四类是不错的经验值,因为上述四类在物理机制上有明显区分)。聚类结果叠加到站点分布图上,能看到非常清晰的区域分带规律,比如山前到平原中心,动态类型会沿着地下水流方向发生系统性变化。
这种从“数据”到“类型”再到“机制”的认识升级,才是这份11897个站点数据最值得挖掘的深层价值。
5. Excel与Python联动的实战姿势:两种处理路线对比
聊了这么多分析思路,实际动手时大家最关心的还是“到底用什么工具跑”。我给出的建议是:Excel做表格级检查与展示,Python做批量处理与统计,两者配合能极大提升效率。
5.1 Excel的透视表与条件格式快速检查
不用打开任何编辑器,先用Excel对11897个站点做一个全局体检。推荐的做法是:新建透视表,把“监测井编号”放行区域,“监测日期”放列区域,“地下水埋深”放值区域,值字段设为平均值。这样每个站点就是一行,每年就是一列,站点之间的时空差异一目了然。
接着用条件格式把埋深数值设成三色色阶,绿色代表小埋深(水位浅),红色代表大埋深(水位深)。你会看到某些区域的站点从2005到2021年,颜色从绿逐渐变红,这就是区域水位持续下降最直观的可视化证据。这种展示方式用在报告里面,比贴一堆统计表格更有说服力。
另外,Excel里有一句经验值:千万别在原始文件上直接操作。我在处理这份数据集时,第一件事就是把文件复制一份为副本,原始文件永久只读。因为废水文数据一旦被透视表操作、排序、筛选搞乱了,恢复成本可能比重新下载还高。
5.2 Python批量处理与可视化的完整工作流
当数据量超过几十万行时,Excel的筛选就开始卡顿,这时候必须上Python。我一般建议用Anaconda自带的Jupyter来跑,交互式探索和可视化都很方便。下面给一个相对完整的读入+清洗+出图流程,你可以直接复制改路径使用:
python复制import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 解决中文乱码
plt.rcParams["axes.unicode_minus"] = False
# 读取多sheet的Excel
file_path = "groundwater_daily_2005_2021.xlsx"
xl = pd.ExcelFile(file_path)
print("工作表列表:", xl.sheet_names)
# 假设每个sheet是一年数据,合并
df_list = []
for sheet in xl.sheet_names:
tmp = pd.read_excel(xl, sheet_name=sheet, engine="openpyxl")
df_list.append(tmp)
df = pd.concat(df_list, ignore_index=True)
# 统一日期并进行基本清洗
df["监测日期"] = pd.to_datetime(df["监测日期"], errors="coerce")
df = df.dropna(subset=["监测日期"])
df["地下水埋深"] = pd.to_numeric(df["地下水埋深"], errors="coerce")
df = df[(df["地下水埋深"] > 0) & (df["地下水埋深"] < 500)]
# 按站点站点+时间排序
df = df.sort_values(["监测井编号", "监测日期"])
# 抽取一个站点画过程线,示例
one_well = df[df["监测井编号"] == "B12000001"].set_index("监测日期")["地下水埋深"]
one_well.plot figsize=(12, 4), title="某国家站地下水位埋深过程线")
plt.gca().invert_yaxis() # 埋深值越大水位越低,反转Y轴更直观
plt.ylabel("埋深 (m)")
plt.show()
这段代码的细节提示:
pd.ExcelFile可以一次性读取多个sheet而不必反复打开文件,合并时通过ignore_index=True防止索引重叠。- 埋深上限500米是一个经验阈值,实测中几乎没有浅层监测井埋深会超过这个数,如果发现超过的站点,建议核对井深。
- 画过程线时用
invert_yaxis()反转Y轴,这样图中水位线向下就代表水位下降、图形更符合直觉,很多行外人看水位图第一次都会被坐标方向搞晕。
可视化的好处是能快速发现“坏点”。如果你画出来一个站点的过程线在某个时间点出现一个突兀的尖峰,极大可能是人为录入错误或监测井临时处理,需要回去对照原始备注排查。
6. 这份数据的三类典型应用场景拆解
数据最终要落地到业务场景里才有价值。根据我对这份数据的观察,它的应用场景主要集中在水文地质研究、水资源管理和教学实验三个方向。
6.1 区域地下水超采评价与修复效果跟踪
北方地区的超采治理是近年来的重点工作,这份数据恰好覆盖了治理前后的完整时段。你可以做的事情包括:识别超采区漏斗中心的位置迁移、评估南水北调通水后水源压采效果、追踪典型地下水超采区的埋深恢复曲线。
实操时有个好用的做法:把站点按地级市聚合,算每个市每年的区域性埋深中位数,然后做箱线图年度对比。如果某个市从2019年之后箱体持续上移(埋深变浅),说明治超措施开始见效。我在实际评估中遇到过很有意思的现象:有的站点在统计上显示埋深快速减小,但看原始日尺度过程线,会发现这个“减小”主要是雨季一次剧烈补给造成的,不是开采量真实压减的结果。这种细节如果不看日尺度数据,很容易得出乐观的误判。
6.2 地下水-地表水相互作用与生态基流保障
做河流生态修复项目时,经常需要分析河道两侧地下水的变化对河川基流的影响。日尺度地下水位数据可以和河道断面流量数据叠加分析,识别出地下水补给的滞后时间。
以某北方河流为例,我实测的流程是:选取河道附近1000米内的监测井,计算连续三天的平均埋深,再与河道流量做滞后相关分析。经验上,山前砾石层地区地下水和河水的响应时间在1到3天,平原细粒土层地区在5到15天。这类分析只有日尺度数据能做出来,月尺度平均数据会把这种响应关系彻底掩盖掉。
6.3 高校科研与毕业论文的素材支撑
对于地质、水文、环境类专业的学生来说,这份数据算得上一个现成的“富矿”。一篇典型的毕业论文可以从这里挖出多种选题:某个典型流域的地下水位动态对气候变化的响应、不同含水层组水位变化差异、极端降水事件对地下水补给的贡献估算等。
我给学生的建议是:不一定非要选一个很大的区域,选一个小范围、有代表性的灌区或流域,深挖3到5个站点的日尺度数据,讲清楚动态特征和驱动机制,文章深度和逻辑完整性会比大而全的分析高很多。日尺度数据的优势就在于能支撑你讨论“哪一场雨、哪一次灌溉行为导致了水位变化”这种精细问题,这是评审专家很喜欢看到的分析粒度。
7. 常见问题排查与避坑总结
最后把我在处理这份数据时踩过的坑集中列出来,这些是文档里不会写、只有实际跑过才会懂的细节。
| 问题现象 | 可能原因 | 排查解决方式 |
|---|---|---|
| Excel打开csv或xlsx文件后日期变成数字 | EXCEL日期序列号显示格式问题 | 选中列→分列→日期格式,或用Python的1899-12-30起点转换 |
| 合并多年数据后站点数量不对 | 每年监测站数量不一致,不少站点中途建井或报废 | 按站点做完整性统计,识别新增和消失站点 |
| 同一个站点一天有两条记录 | 自动监测加人工校核重复记录 | 按“站点+日期”去重,保留人工校核值或均值 |
| 文件太大Excel打开卡死 | xlsx里堆了大量公式和重复格式 | 另存为CSV或xlsb二进制格式,或直接用pandas读取 |
| 中文乱码 | 编码不一致,UTF-8和GBK之间冲突 | 读取时指定encoding="utf-8"或encoding="gbk" |
| 同一站点的埋深在某一年突然整体平移 | 监测井口高程基准点改变,或设备重新调零 | 通过前后年份衔接段判断是否平移,确认后分段打标 |
7.1 常见的隐藏坑:联网自动监测与人工测绳数据混接
这里单独说一个很容易忽视的坑。国家级监测站点很多从2014年左右开始建设自动监测设备,而早期的人工测绳观测数据延续到了自动设备上。自动设备测的是“探头到水面的距离”,人工测的是“井口固定点到水面的距离”,两者基准点可能并不完全一致,如果设备安装时的零点没有严格对到井口固定点,就会造成序列里出现一个系统性偏移。
排查方法其实很简单:看过程线,寻找一个在1到2天内完成的“方波式”跳变且后续没有回弹。如果是这种跳变,接头前后两段其实各自是有效的,但接头位置要做分段处理,不能直接混在一起做趋势分析。这个坑在单个站点上可能对趋势斜率造成每年0.1到0.3米的误差,对于动辄分析十年趋势的项目来说,足以让结论发生翻转。
7.2 区域统计的边界问题:面积加权还是简单平均
最后提一个很多分析中常犯的方法学错误:把某个区域内的所有监测井埋深简单平均,然后代表区域水位。这里的问题在于,国家监测井的布设并不均匀,一个县可能只有1口井,另一个县有20口井,简单平均会天然偏向布井密度大的区域。
我建议在做区域统计前,至少做一次站点密度分布图,如果分布极不均匀,考虑用泰森多边形加权或者网格化重采样后再统计。还有一个做法:用站点数据插值到栅格(比如1km分辨率),再对栅格做面积平均,这样能有效降低布井不均的偏差。插值方法上,普通的IDW(反距离权重)就行,如果站点数量足够多,用克里金会更平滑,但要注意径向基函数容易产生“牛眼”现象。
本篇数据涉及11897个国家级地下水动态监测站点、17年日尺度监测序列,整理成EXCEL格式之后,它的可操作性比我以前处理的很多地质数据都要强。我个人在项目里用得最多的还是那套“透视表看全局、Python跑趋势、单站过程线验证”的组合拳,这套思路从数据拿到手到得出可靠结论,效率很高。最后再分享一个实用小技巧:把年份列单独提取出来,和汛期(6-9月)非汛期(10月-次年5月)做一个交叉分组汇总,很多隐藏的水文规律在这么简单的分组下就会自己浮出来。数据本身不会说话,但当你把它拆得足够细、铺得足够开,它就会把区域水文演变的真相慢慢讲给你听。
