今天给大家分享如何使用 R 语言从 NASA MERRA-2 卫星再分析数据中计算各省市区县的相对湿度日度面板数据的方法,本课程包含如下内容:
- 从 NASA GES DISC 下载 MERRA-2 NetCDF(.nc)格式数据;
- 使用 terra 包读取并处理栅格数据;
- 根据气象公式计算相对湿度(RH);
- 使用 terra::extract() 将栅格汇总为省市区县面板数据;
- 合并多天结果并导出为 Excel 格式。
数据来源
本课程使用的原始数据来自 NASA MERRA-2(Modern-Era Retrospective Analysis for Research and Applications, Version 2)逐小时近地表气象数据集:
数据集:M2I1NXLFO 5.12.4
数据类型:NetCDF(.nc)格式,逐小时,覆盖全球
该数据集包含以下变量:
| 变量名 | 含义 | 单位 |
|---|---|---|
| HLML | 地表层高度(Surface Layer Height) | m |
| PS | 地表气压(Surface Pressure) | Pa |
| QLML | 近地表比湿(2m Specific Humidity) | kg/kg |
| SPEEDLML | 近地表风速(Surface Wind Speed) | m/s |
| TLML | 近地表气温(2m Temperature) | K |
其中**比湿(specific humidity)**是指在一团湿空气中,水汽的质量与该团空气总质量的比值。如果湿空气与外界无质量交换,并且没有相变发生,那么比湿会保持不变。比湿通常以 g/g 或 g/kg 为单位,通常大气中的比湿都小于 40 g/kg,是记录大气水汽状况的重要指标。
相对湿度的计算原理
![]()
第一步:下载 MERRA-2 数据
这部分内容可以参考:
名师讲堂|逆温数据是如何处理的?使用 R 语言完成整个过程:https://rstata.duanshu.com/#/brief/course/55b47a7a83124138b918e7475f4141d9
注册 NASA 账号并获取下载链接
首先前往 NASA GES DISC 注册账号:https://disc.gsfc.nasa.gov
然后打开数据集页面,点击右下角 Subset/Get Data,按以下设置筛选:
- Download Method:选择 Get File Subsets using OPeNDAP;
- Refine Date Range:选择所需时间段,例如 2025-01-01 到 2025-12-31;
- Refine Region:输入中国经纬度范围。
中国的经纬度范围可以通过 R 代码获取:
library(sf) |
- 变量全部勾选(HLML、PS、QLML、SPEEDLML、TLML);
- 点击 Get Data → Download links list,下载一个 .txt 格式的下载链接文件。
注意:下载链接的有效期仅为 两天,过期后需要重新生成。
注意要选择 Mean of complete time range,否则下载得到的是小时数据。
![]()
配置 NASA 登录凭证(Mac/Linux)
在终端依次运行以下命令(将 <uid> 和 <password> 替换为你的 NASA 账号):
cd ~ |
批量下载 nc 文件
将下载链接文件放到工作目录的 data 文件夹下,然后在终端运行:
cd "你的工作目录/data/" |
由于数据量较大,可以使用 R 将链接拆分成多段,同时开多个终端窗口并行下载:
library(tidyverse) |
下载完成后,data 文件夹中会包含多个类似 MERRA2_400.inst1_2d_lfo_Nx.20250101.SUB.nc 的文件:
fs::dir_ls("data") |
第二步:读取 nc 文件并转换为日均 tif
nc 数据可以直接使用 terra 包读取:
library(tidyverse) # 加载数据科学包集合 |
可以看到,每个文件有 5 层(5 个变量)。
第三步:计算相对湿度
本课程提供了一个封装好的函数 calculate_merra_rh(),位于 calculate_merra_rh.R 文件中:
source("calculate_merra_rh.R") |
函数内部实现如下:
#' 从MERRA-2栅格数据计算相对湿度 |
对单个文件计算相对湿度并可视化:
# 读取某天的 |
循环处理所有天的数据,生成相对湿度栅格并保存:
# 循环所有的 |
第四步:读取行政区划矢量数据
将栅格数据汇总到省市区县,需要先读取行政区划的 shp 文件(本课程附件提供 2021 年行政区划数据):
library(sf) |
注意:如果需要处理乡镇级数据,可以额外读取乡镇 shp 或 rds 文件,代码结构相同。
第五步:提取各省市区县均值
使用 terra::extract() 对每天的原始 MERRA-2 栅格(含 HLML、PS、QLML、SPEEDLML、TLML)和相对湿度栅格分别提取各行政区划的区域均值,结果保存在 res1(原始变量)和 res2(相对湿度)两个文件夹中:
此处代码需下载讲义材料查看~
提取结果示例(省级):
read_rds("res1/20250110_prov.rds") |
第六步:合并所有天的结果
将 res1 和 res2 中每天的结果分别合并,再 left_join 到一起,得到包含所有变量的完整面板数据:
此处代码需下载讲义材料查看~
查看省级面板结果:
dfprovall
相对湿度的频率分布:
hist(dfcityall$RH, |
第七步:保存结果
# 保存为 rds 文件 |
数据结构说明
最终面板数据包含如下变量:
| 变量名 | 含义 | 单位 |
|---|---|---|
| 省/市/县 | 行政区划名称 | — |
| 省代码/市代码/县代码 | 行政区划代码 | — |
| date | 日期 | — |
| HLML | 地表层高度 | m |
| PS | 地表气压 | Pa |
| QLML | 近地表比湿 | kg/kg |
| SPEEDLML | 近地表风速 | m/s |
| TLML | 近地表气温 | K |
| RH | 相对湿度 | % |
年度和月度数据可以使用日度数据分组汇总得到,大家可以独立完成
group_by+summarise的汇总操作。
注意事项
- 数据量较大:全国区县级的日度数据每天约 2800 条记录,一年约 100 万条,读取和处理时内存消耗较大,建议分年处理或使用
parallel包多线程加速; - 依赖包版本:本课程使用的是
terra包 1.7+ 版本,旧版本可能在读取某些 nc 文件时出现坐标系识别问题,如遇此类情况可手动设置:
ext(rst) <- c(73.4375, 135.3125, 3.75, 53.75) |
- 比湿单位:MERRA-2 数据中 QLML 的单位为 kg/kg(与 g/g 等价),在相对湿度公式中直接使用,无需换算;
- 相对湿度合理性校验:计算结果已通过
terra::clamp(rh, 0, 100)限定在 0~100% 范围内,极端值通常由数值误差引起,属于正常现象。
相关课程推荐
- 使用 R 语言处理 Merra2 数据获取各省市区县的比湿、降水量、风速和气压数据
- 使用 R 语言处理 netCDF 格式的数据
- 1980年1月1日~2025年12月31日各省市区县相对湿度、比湿、地表高度、气压、风速和气温日度数据
点击这里跳转到 RStata 短书平台获取附件:如何使用 R 语言计算各省市区县相对湿度面板数据
评论