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

时间:2018-10-19 14:19:28

标签: python python-xarray

我有一个xarray数据集,其中包含爱尔兰一年的每月CO2排放数据,如下所示:

<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 ...

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

enter image description here

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

sum = ds.co2.sum()

给出:

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

这将整个数据求和,仅给出一个值。我想生成一个新的数据集,其中包含每个纬度/经度组合的月度数据的总和,有效地给出“年度”总和,然后我可以生成一个地图。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如您在答案中所指出的,通过提供维度名称,可以沿数据集或数据数组的任何(或多个)维度完成xarray aggregation operations

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)

获取年度时间序列。

答案 1 :(得分:0)

好吧,我想我做到了,总结“时间”维度似乎是可行的!:

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 ...

这张年度总图:

enter image description here

不幸的是,所有NA值都已变为零,我将不得不以某种方式将其更改回NA。

编辑:

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

sum2016mask = sum2016.where(sum2016 != 0.0)

给出更好的地图:

enter image description here