如何将多个NetCDF文件中的变量合并为单个NetCDF文件
问题解答
你的场景应该使用xarray.concat实现,不要用xarray.merge。
两个函数的核心区别
xarray.merge:用于合并不同变量/非重叠坐标的数据集,适用场景是多个文件存储不同变量、其他维度完全匹配,例如一个文件存u流速、一个文件存v流速,需要把两个变量拼到同一个数据集时使用。xarray.concat:用于沿着指定的已有维度堆叠结构完全一致的数据集/变量,正好匹配你当前两个文件都包含u/v/w三个流速变量、仅时间步不同的时间序列拼接场景。
具体实现方法
方法1:基于你现有代码修改
你已经单独提取了两个文件的u/v/w变量,可以直接对同变量沿time维度拼接,再重组为完整数据集后导出:
import netCDF4 import pandas as pd import numpy as np import xarray as xr df1 = xr.open_dataset("ocean_avg_November.nc4") # 2013年11月NetCDF文件 df2 = xr.open_dataset("ocean_avg_December.nc4") # 2013年12月NetCDF文件 du1 = df1['u'] # x方向海流流速 dv1 = df1['v'] # y方向海流流速 dw1 = df1['w'] # 垂直方向海流流速 du2 = df2['u'] dv2 = df2['v'] dw2 = df2['w'] # 沿时间维度拼接同变量 u_comb = xr.concat([du1, du2], dim="time") v_comb = xr.concat([dv1, dv2], dim="time") w_comb = xr.concat([dw1, dw2], dim="time") # 组装为完整数据集 comb_ds = xr.Dataset({ "u": u_comb, "v": v_comb, "w": w_comb }) # 导出为合并后的NetCDF文件 comb_ds.to_netcdf("ocean_avg_2013Nov_Dec.nc")
方法2:更简便的全数据集拼接
因为两个NetCDF文件的变量、空间维度(经纬度、深度)结构完全一致,不需要单独提取变量,直接拼接整个数据集即可:
# 建议拼接前先给每个文件赋值正确的时间坐标,避免时间值重复/错乱 df1 = df1.assign_coords(time=pd.Timestamp("2013-11-01")) df2 = df2.assign_coords(time=pd.Timestamp("2013-12-01")) # 直接沿时间维度拼接两个完整数据集 comb_ds = xr.concat([df1, df2], dim="time") comb_ds.to_netcdf("ocean_avg_2013Nov_Dec.nc")
方法3:批量读取多文件自动拼接
如果后续你有更多月份的文件需要合并,不需要逐个手动打开文件,可以用xarray.open_mfdataset批量匹配文件、自动沿时间维度拼接:
# *为通配符,匹配所有文件名符合ocean_avg_开头的nc4文件 comb_ds = xr.open_mfdataset( "ocean_avg_*.nc4", concat_dim="time", combine="nested" ) comb_ds.to_netcdf("ocean_avg_merged_timeseries.nc")
注意事项
如果拼接后发现时间维度数值异常(比如两个时间步的值完全相同),优先检查单个原始文件的time坐标值,按照方法2里的assign_coords方式手动给每个文件赋予正确的时间戳即可。
内容的提问来源于stack exchange,提问作者Omi
相关产品推荐
相关产品推荐

