繁体   English   中英

使用 xarray python 组合空间 netcdf 文件

[英]combining spatial netcdf files using xarray python

有没有办法将 2 个或多个具有相同时间维度但不同空间域的 netCDF 文件合并到一个 netCDF 文件中? 空间域由纬度和经度坐标指定? 在 xarray concat、merge 等的文档中,他们说他们使用单一维度

xarray 现在直接通过open_mfdataset支持多维串联。

关于沿多个维度组合数据的文档在这里,但由于您的问题与这个问题非常相似,我将在这里复制我的答案的关键部分:


你有一个二维串联问题:你需要排列数据集,这样当沿着 x 和 y 连接时,它们会形成一个更大的数据集,它也有维度 x 和 y。

只要len(x)在每个文件中都相同,并且len(y)在每个文件中都相同,理论上您应该能够以一种或两种不同的方式做到这一点。

1)使用combine='nested'

您可以手动指定您需要它们加入的顺序。 xarray 允许您通过将数据集作为网格传递来执行此操作,指定为嵌套列表。 在您的情况下,如果我们有 4 个文件(名为 [upper_left、upper_right、lower_left、lower_right]),我们会像这样组合它们:

from xarray import open_mfdataset

grid = [[upper_left, upper_right], 
        [lower_left, lower_right]]

ds = open_mfdataset(grid, concat_dim=['x', 'y'], combine='nested')

我们必须告诉open_mfdataset网格的行和列对应于数据的哪些维度,以便它知道将数据连接到哪些维度。 这就是为什么我们需要传递concat_dim=['x', 'y']

2)使用combine='by_coords'

但是您的数据中已经有了坐标 - xarray 不能只使用这些坐标以正确的顺序排列数据集吗? 这就是combine='by_coords'选项的用途,但不幸的是,它需要一维坐标(也称为维坐标)来排列数据。 如果您的文件没有任何这些,打印输出将显示Dimensions without coordinates: x, y )。

如果您可以先将一维坐标添加到您的文件中,那么您可以使用combine='by_coords' ,然后您可以按任何顺序传递所有文件的列表,即

ds = open_mfdataset([file1, file2, ...], combine='by_coords')

但否则你将不得不使用combine='nested'

我对您的问题的理解是,您想要打开多个 netcdf 文件,其中包含数据的不同空间部分,其中整个数据集已沿latlon分解。

如果是这样的话,那么恐怕 xarray 目前不支持这一点,我在此处的 xarray github 上询问了完全相同的问题

同样的事情也被问到了 SO here。 那里提到的concat解决方案将起作用。

在我的例子中,我想将连接的数据集保存到一个新的 netcdf 文件中,但使用这种方法最终将所有数据一次加载到内存中。 为了解决这个问题,我最终不得不使用 netcdf python 库在较低级别解决这个问题,但这需要付出很多努力。

我不知道在python(或R,FORTRAN)中执行此操作的“自动”方法,只能手动将文件读入更大的数组,然后将该数组写入新的netcdf文件,但还有更多“自动化”以使用 CDO 从命令行执行此操作。

如果您定义包含两个(或更多)文件区域的域描述文件 grid.txt:

gridtype = lonlat
gridsize = 420
xname = lon
xlongname = longitude
xunits = degrees east
yname = lat
ylongname = latitude
yunits = degrees north
xsize = 21
ysize = 20
xfirst = -11.0
xinc = 1
yfirst = -20.0
yinc = 1

然后将第一个文件 file1.nc “扩展”到更大的域,然后合并两个 netcdf 文件的内容:

cdo expand,grid.txt file1.nc large.nc
cdo mergegrid large.nc file1.nc merge1.nc
cdo mergegrid merge1.nc file2.nc final_merge.nc 

我在这里找到了这个解决方案: https : //code.mpimet.mpg.de/boards/1/topics/26并且在我需要将 2 或 3 个文件合并在一起时使用了它。 然而,当我需要将数百个文件合并在一起时,每个文件都包含一个纬度行数据,我编写了一个手动程序(在我的例子中是 R)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM