如何在MATLAB中合并多份GLDAS月度NETCDF土壤湿度数据为单文件
MATLAB批量提取GLDAS月度NetCDF土壤湿度并拼接时间序列
GLDAS NOAH025_M v2.1月度产品的单文件包含单月所有陆面变量,土壤湿度按4个观测层存储,对应变量名分别为SoilMoi0_10cm_inst(0-10cm层)、SoilMoi10_40cm_inst(10-40cm层)、SoilMoi40_100cm_inst(40-100cm层)、SoilMoi100_200cm_inst(100-200cm层),可按需选择提取目标。
操作流程
- 将所有下载好的单月nc4文件统一放到单独的文件夹中,不要混入其他格式或其他数据集的文件。
- 读取首个文件的经纬度、变量维度信息,提前预分配存储内存,避免循环中动态扩容降低运行效率。
- 循环遍历所有文件,提取目标土壤湿度变量,同时解析文件名中的年月信息作为时间维度标记。
- 按时间维度校验排序后,将合并好的三维数据集(经度×纬度×月份)存储为本地文件。
可直接复用的MATLAB代码
%% 参数配置 % 替换为本地存放GLDAS月度nc4文件的文件夹路径 input_dir = 'E:/Dataset/GLDAS/NOAH025_M/monthly/'; % 按需调整要提取的土壤湿度层变量 target_sm_vars = {'SoilMoi0_10cm_inst','SoilMoi10_40cm_inst','SoilMoi40_100cm_inst','SoilMoi100_200cm_inst'}; % 合并后结果的保存路径 output_file = 'E:/Dataset/GLDAS/GLDAS_monthly_soil_moisture_series.mat'; %% 批量获取文件列表 nc_files = dir(fullfile(input_dir, '*.nc4')); file_count = length(nc_files); if file_count < 1 error('指定路径下未找到nc4格式文件,请检查输入路径是否正确'); end %% 初始化数据集 % 读取首个文件的空间基准信息 ref_file = fullfile(nc_files(1).folder, nc_files(1).name); lon = ncread(ref_file, 'lon'); lat = ncread(ref_file, 'lat'); n_lon = length(lon); n_lat = length(lat); % 预分配存储数组 sm_dataset = struct(); for i = 1:length(target_sm_vars) var = target_sm_vars{i}; sm_dataset.(var) = nan(n_lon, n_lat, file_count); end time_axis = NaT(file_count, 1); %% 循环读取并拼接 for fi = 1:file_count disp(['正在处理:' nc_files(fi).name ' (' num2str(fi) '/' num2str(file_count) ')']); curr_file = fullfile(nc_files(fi).folder, nc_files(fi).name); % 从文件名解析年月,文件名固定格式为GLDAS_NOAH025_M.AYYYYMM.021.nc4 yr = str2double(nc_files(fi).name(19:22)); mon = str2double(nc_files(fi).name(23:24)); time_axis(fi) = datetime(yr, mon, 1); % 读取目标变量 for vi = 1:length(target_sm_vars) var = target_sm_vars{vi}; sm_dataset.(var)(:,:,fi) = ncread(curr_file, var); end end %% 按时间排序(避免文件命名乱序导致时间序列错误) [time_axis, sort_idx] = sort(time_axis); for i = 1:length(target_sm_vars) var = target_sm_vars{i}; sm_dataset.(var) = sm_dataset.(var)(:,:,sort_idx); end %% 保存结果 save(output_file, 'sm_dataset', 'lon', 'lat', 'time_axis', 'target_sm_vars', '-v7.3'); disp(['合并完成,结果已保存至:' output_file]);
注意事项
- 首次运行前可先用
ncdisp(参考文件路径)命令查看nc文件内的实际变量名、填充值、单位信息,和代码配置做匹配,GLDAS土壤湿度默认单位为kg/m²,除以水的密度1000kg/m³即可转换为常用的体积含水量单位m³/m³。- 如果需要获取整层土壤柱总含水量,可按各层厚度加权求和:0-10cm层厚0.1m、10-40cm层厚0.3m、40-100cm层厚0.6m、100-200cm层厚1m。
- 若数据存在缺测,可结合文件自带的
_FillValue属性做掩膜处理,避免缺测值参与后续计算。
内容的提问来源于stack exchange,提问作者pragati Kharya
相关产品推荐
相关产品推荐

