使用xarray和matplotlib绘制年度总和图

Using xarray and matplotlib to draw maps of annual sums

我有一个 xarray 数据集,其中包含爱尔兰一年的月度二氧化碳排放数据,如下所示:

<xarray.Dataset>
Dimensions:  (lat: 733, lon: 720, time: 12)
Coordinates:
  * lat      (lat) float32 49.9 49.9083 49.9167 49.925 49.9333 49.9417 49.95 ...
  * lon      (lon) float32 -11.0 -10.9917 -10.9833 -10.975 -10.9667 -10.9583 ...
  * time     (time) int16 181 182 183 184 185 186 187 188 189 190 191 192
Data variables:
soc      (lat, lon, time) float64 nan nan nan nan nan nan nan nan nan ...
ch4      (lat, lon, time) float64 nan nan nan nan nan nan nan nan nan ...
co2      (lat, lon, time) float64 nan nan nan nan nan nan nan nan nan ...
n2o      (lat, lon, time) float64 nan nan nan nan nan nan nan nan nan ...
no3      (lat, lon, time) float64 nan nan nan nan nan nan nan nan nan ...

如果我绘制一个月的数据,它看起来像这样:

我想对每个 lat/lon 组合每个月的排放量求和,并制作一张类似的地图,用于年度总和而不是月度值。我可以这样总结数据:

sum = ds.co2.sum()

给出:

<xarray.DataArray 'co2' ()> array(453300000)

这对所有数据求和,只给出一个值。我想生成一个新数据集,其中包含每个 lat/lon 组合的每月数据总和,有效地给出 'annual' 总和,然后我可以生成一个地图。

如有任何帮助,我们将不胜感激!

好的,我想我做到了,对 'time' 维度求和似乎有效!:

sum2016 = ds.co2.sum(dim=('time'))

产生:

<xarray.DataArray 'co2' (lat: 733, lon: 720)>
array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
   [ 0.,  0.,  0., ...,  0.,  0.,  0.],
   [ 0.,  0.,  0., ...,  0.,  0.,  0.],
   ..., 
   [ 0.,  0.,  0., ...,  0.,  0.,  0.],
   [ 0.,  0.,  0., ...,  0.,  0.,  0.],
   [ 0.,  0.,  0., ...,  0.,  0.,  0.]])
Coordinates:
  * lat      (lat) float32 49.9 49.9083 49.9167 49.925 49.9333 49.9417 49.95 ...
  * lon      (lon) float32 -11.0 -10.9917 -10.9833 -10.975 -10.9667 -10.9583 ...

这张年度总和图:

遗憾的是,所有的 NA 值都变成了零,我将不得不以某种方式将它们改回 NA。

编辑:

我使用以下代码将 0.0 值转换为 NA:

sum2016mask = sum2016.where(sum2016 != 0.0)

提供这张更好的地图:

正如您在回答中发现的那样,xarray aggregation operations 可以通过提供维度名称沿 Dataset 或 DataArray 的任何(或多个)维度完成:

sum2016 = ds.co2.sum(dim='time')

默认情况下,聚合操作会跳过浮点数中的 NaN 值。您可以使用 da.sumskipna=False 参数来保留 NaN 值,例如:

sum2016 = ds.co2.sum(dim='time', skipna=False)

如果您的数据集中有多个年份,您可以 group by 年份(无论您如何计算),然后对一年中的月份求和。例如,如果数据集中的时间只是月份的位置索引,并且可以使用 ds.time%12 找到年份,则可以使用:

找到年度总数
ds.co2.groupby(ds.time%12).sum(dim='time', skipna=False)

获取年度时间序列。