如何用Python的netCDF4合并同空间维度的多份netCDF数据集?
合并同空间维度的NetCDF时间序列文件
针对你要合并两个空间维度一致、时间维度分别为365的NetCDF文件的需求,最优实现方式是直接使用netCDF4库完成维度拼接,全程在内存中处理(数据量不大的情况下),步骤清晰且性能高效。
完整实现代码
import netCDF4 as nc import numpy as np # 1. 打开输入文件 file1 = nc.Dataset('year1.nc', 'r') file2 = nc.Dataset('year2.nc', 'r') # 2. 创建输出文件 output_file = nc.Dataset('combined_years.nc', 'w', format='NETCDF4') # 3. 复制空间维度(longitude、latitude) for dim_name in ['longitude', 'latitude']: dim = file1.dimensions[dim_name] output_file.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) # 4. 创建合并后的时间维度 total_time = len(file1.dimensions['time']) + len(file2.dimensions['time']) output_file.createDimension('time', total_time) # 5. 复制全局属性(可选,按需保留原文件的全局元数据) output_file.setncatts(file1.__dict__) # 6. 复制变量定义并拼接数据 for var_name in file1.variables: var_in = file1.variables[var_name] # 创建输出变量,维度沿用原变量的维度顺序 var_out = output_file.createVariable( var_name, var_in.datatype, var_in.dimensions ) # 复制变量属性(单位、描述等) var_out.setncatts(var_in.__dict__) # 拼接数据:时间相关变量合并,非时间变量直接复制 if 'time' in var_in.dimensions: data1 = var_in[:] data2 = file2.variables[var_name][:] # 匹配time维度在变量中的索引位置,沿对应轴拼接 time_axis = var_in.dimensions.index('time') combined_data = np.concatenate((data1, data2), axis=time_axis) var_out[:] = combined_data else: # 非时间变量(如空间坐标)直接复用第一个文件的内容 var_out[:] = var_in[:] # 7. 关闭所有文件 file1.close() file2.close() output_file.close()
关键说明
- 维度处理:空间维度完全一致时,直接从第一个文件复制维度定义即可,无需重复读取两个文件的空间坐标。
- 时间拼接:通过
np.concatenate沿时间轴合并数据,注意匹配变量维度中time的索引位置(如果你的变量维度顺序是time/lon/lat,需调整axis参数)。 - 属性保留:通过
setncatts方法复制全局和变量的元数据,确保合并后的文件保留原有的数据描述信息。 - 性能优化:你的案例中单个文件数据量极小(5x5x365),一次性加载处理效率最高;如果后续遇到大文件,可改为分块读取写入。
内容的提问来源于stack exchange,提问作者Frank Seidl
相关产品推荐
相关产品推荐

