如何在Python中使用xarray将多个netCDF文件中的数据连接起来?

问题描述 投票:5回答:3

我正在尝试用Python中的xarray打开多个netCDF文件。文件具有相同形状的数据,我想加入它们,创建一个新的维度。

我试图为xarray.open_mfdataset()使用concat_dim参数,但它不能按预期工作。下面给出一个例子,它打开两个文件,温度数据为124次,241个纬度和480个经度:

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases' )
da_t2m = DS.t2m

print( da_t2m )

使用此代码,我希望结果数据数组的形状类似(例如:2,时间:124,纬度:241,经度:480)。然而,它的形状是(情况:2,时间:248,纬度:241,经度:480)。它创建了一个新维度,但也总结了最左边的维度:两个数据集的“时间”维度。我想知道这是'xarray.open_mfdateset'中的错误还是预期的行为,因为'time'维度对于两个数据集都是无限的。

有没有办法直接使用xarray从这些文件加入数据并获得上述预期的回报?

谢谢。

马修

python concatenation netcdf python-xarray multiple-files
3个回答
2
投票

从我的评论中扩展我会试试这个:

def preproc(ds):
    ds = ds.assign({'stime': (['time'], ds.time)}).drop('time').rename({'time': 'ntime'})
    # we might need to tweak this a bit further, depending on the actual data layout
    return ds

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases', preprocess=preproc)

这里的好处是,你在stime中保留原始时间坐标,同时重命名原始维度(time - > ntime)。

如果一切正常,你应该得到最终尺寸(casesntimelatitudelongitude)。

免责声明:我在循环中做了类似的最终concat(效果非常好),但没有测试preprocess方法。


1
投票

如果时间不同,结果才有意义。

为了简化它,暂时忘掉lat-lon维度,并想象你有两个文件只是2倍的数据。第一个数据的时间步长为1,2,第二个文件的时间步长为3和4.您无法创建时间维度仅为2个时间点的组合数据集;时间维度变量必须具有1,2,3,4的时间。因此,如果您说想要一个新的维度“案例”,那么数据将组合为一个二维数组,如下所示:

times: 1,2,3,4

cases: 1,2

data: 
               time
          1    2    3    4
cases 1:  x1   x2 
      2:            x3   x4

可以想象netcdf文件是等效的,时间维度必须跨越两个文件中存在的值范围。你可以组合两个文件并得到(例如:2,时间:124,纬度:241,经度:480)的唯一方法是,如果两个文件具有相同的时间,lat和lon值,即指向完全相同的区域时间 - 纬度 - 空间。

ps:对于这个问题有些偏离主题,但是如果你刚刚开始一个新的分析,为什么不转而使用更高分辨率的新一代ERA-5再分析,现在可以追溯到1979年(并最终将扩展)您可以从这里使用python api脚本将其直接下载到桌面:

https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset


0
投票

谢谢@AdrianTompkins和@jhamman。在您的评论之后,我意识到,由于不同的时间段,我真的无法得到我想要的,使用xarray。

我创建这样的数组的主要目的是在一个N-D阵列中获得具有相同持续时间的不同事件的所有数据。因此,我可以很容易地获得,例如,每个时间(小时,天等)的所有事件的复合字段。

我正在努力做与NCL一样的事情。请参阅下面的NCL代码,该代码对于相同的数据按预期工作(对我来说):

f = addfiles( (/"eraINTERIM_t2m_201812.nc", "eraINTERIM_t2m_201901.nc"/), "r" )
ListSetType( f, "join" )
temp = f[:]->t2m
printVarSummary( temp )

最终结果是一个包含4维的数组,新的数组自动命名为ncl_join。

但是,NCL不尊重时间轴,连接数组并为结果时间轴提供第一个文件的坐标。所以,时间轴变得无用。

但是,对于@AdrianTompkins来说,时间段也不同,xarray也不能像这样加入数据。因此,要创建这样的数组,在Python中使用xarray,我认为唯一的方法是从数组中删除时间坐标。因此,时间维度只有整数索引。

xarray给出的数组就像@AdrianThompkins在他的小例子中所说的那样。由于它保留了所有合并数据的时间坐标,我认为与NCL相比,xarray解决方案是正确的。但是,现在我认为复合材料的计算(得到上面给出的相同例子)不会像NCL那样容易地完成。

在一个小测试中,我使用xarray从合并数组中打印两个值

print( da_t2m[ 0, 0, 0, 0 ].values )
print( da_t2m[ 1, 0, 0, 0 ].values )

结果如何

252.11412
nan

对于第二种情况,第一次没有数据,正如预期的那样。

更新:所有答案都帮助我更好地理解这个问题,所以我不得不在这里添加一个更新,也感谢@kmuehlbauer的答案,表明他的代码给出了预期的数组。

再次,谢谢大家的帮助!

马修

© www.soinside.com 2019 - 2024. All rights reserved.