首页 > 解决方案 > 如何从每月均值屏蔽数组计算每年的总和 xarray?

问题描述

我想计算高于 7 和低于 33 摄氏度的日平均温度的年总和。这是针对生物学相关学位天数指数的定制计算。我想在 python 中做这个计算,我想以一种 Python 的方式来做,意思是,使用 xarray 和 numpy 等众所周知的包中已经制作的函数。

我正在使用来自 CDS 的 TG 数据集。它采用 netCDF 格式,跨度从 1981 年到 2010 年。我一直在做这个计算。我能够使用以下命令将数据集重新采样为月平均值:

monmean = ds.TG.resample({"time":"1MS"}).mean()

现在我需要对每日温度平均值的每月平均值进行上述年度总和,但我找不到避免添加那些超出我定义的区间的值的方法。我试着用这样的面具:

masked_array = ma.masked_outside(monmean, 7+273.15, 33+273.15)
masked_monmean = np.ma.masked_where(np.ma.get_mask(masked_array), monmean)

但是随后发生的事情是 masked_monmean 是一个 maskedarray 并且 xarray 函数resample不再适用。

ymonmeansum = masked_monmean.data.resample({'time':'YS'}).sum()

AttributeError: 'numpy.ndarray' object has no attribute 'resample'

你知道我该如何解决这个问题吗?

标签: pythonnumpymasknetcdfpython-xarray

解决方案


您可以使用where之前的方法resample

mask = ds['TG'].isel(time=0)
ds['TG'].where(7.<=ds['TG']).where(ds['TG']<=33.).resample(time='M').mean().where(mask)

where不满足布尔方程的值设置为 nan ,平均值不包括 nan 值。


推荐阅读