如何将来自 xarray 中不同数据集的两个变量相加,同时确保仅对具有相同坐标和时间的数据求和?

问题描述

我目前正在处理降水数据,我的目标是将两种不同类型的降水数据相加得到一个有效的结果,类似于总降水量。我正在使用 xarray 来管理这个多维数据,我希望最终得到由地图上的坐标绘制的降水数据,平均时间维度。重要的是仅将具有相同坐标和时间的数据相加。这两个变量的三个维度是经度、纬度和时间。两个变量具有相同的单位。这两个变量包含在两个单独的数据集中,我想最终得到一个具有经度、纬度和时间维度以及变量总降水量的单个数据数组。我将如何在坐标和时间方面对这两个数据求和?

如果上下文或问题混乱且没有意义,非常抱歉,我是 python 的新手,甚至是 xarray 的新手。任何帮助将不胜感激。

解决方法

据我所知,您有两个数据集,想要确定整个时间平均每个网格单元的降水总和以绘制此图?

案例 1

假设你的两个数据集具有相同的维度比例,它的工作原理是这样的 (在我的示例中,我使用温度数据并计算差异。您只需将“-”替换为“+”即可获得总和):

import xarray as xr,numpy as np
import matplotlib,matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import cartopy.mpl.ticker as cticker # to have ticks
from cartopy.feature import NaturalEarthFeature #coastlines

ds_1 = xr.open_dataset("/PATH2yourFile/dataset1.nc")
ds_2 = xr.open_dataset("/PATH2yourFile/dataset2.nc")

res = ds_1['tsurf'].mean('time') - ds_2['tsurf'].mean('time')

绘图:

plt.figure(figsize=(20,8))
ax = plt.subplot(projection=ccrs.PlateCarree()) 
res.plot.contourf(cmap="Spectral_r",transform=ccrs.PlateCarree(),levels=143)
ax.set_title("difference of mean temperatures",fontsize=18)
ax.set_yticks(np.arange(25,75,10)); plt.xticks(fontsize=16)
ax.set_xticks(np.arange(-45,65,15)); plt.yticks(fontsize=16)
ax.yaxis.set_major_formatter(cticker.LatitudeFormatter())
ax.xaxis.set_major_formatter(cticker.LongitudeFormatter())
ax.set_ylabel("latitude",fontsize=16)
ax.set_xlabel("longitude",fontsize=16)
ax.coastlines()

Plot

如果要保存结果:

res.to_netcdf("result.nc")

案例 2

如果您的数据集具有不同的比例,那么您可以使用 cdo 来获取每个网格单元的总和,如下所示:

cdo add -selvar,pr dataset1.nc -selvar,pr dataset2.nc pr_sum.nc

然后计算总体平均值:

cdo timmean -selvar,pr pr_sum.nc pr_timmean.nc

之后,您可以简单地使用 xarray 将其加载到 python 中并按上述方式绘制。