使用某些 nan 处理进行 xarray 重采样

mgr*_*raf 1 python pandas python-xarray

问题:
当至少一个输入值是 nan 时,我想重新采样一个 xarray 数据集,例如总和或平均值,每个结果值都是 nan。使用 pandas,我可以轻松应用自己的均值、求和等函数,为我提供我喜欢的 nan 处理。xarray 也允许 resample.apply(own_func) 但我在定义自己的 func 时遇到问题。

示例来自 xarray 的文档

dat=np.linspace(0, 11, 12)
dat[2]=np.nan
da = xr.DataArray(dat,
                  coords=[pd.date_range('15/12/1999',
                                        periods=12, 

freq=pd.DateOffset(months=1))],
                      dims='time')

da.resample(time="QS-DEC").sum()
Run Code Online (Sandbox Code Playgroud)

我得到的:

<xarray.DataArray (time: 4)>
array([ 1., 12., 21., 30.])
Coordinates:
  * time     (time) datetime64[ns] 1999-12-01 2000-03-01 2000-06-01 2000-09-01
Run Code Online (Sandbox Code Playgroud)

@JulianGiles 回答:

da.resample(time="QS-DEC",skipna=False).mean()
<xarray.DataArray (time: 4)>
array([ 0.5,  4. ,  7. , 10. ])
Coordinates:
  * time     (time) datetime64[ns] 1999-12-01 2000-03-01 2000-06-01 2000-09-01
Run Code Online (Sandbox Code Playgroud)

我想要的是:

<xarray.DataArray (time: 4)>
array([ 1., NAN, 21., 30.])
Coordinates:
  * time     (time) datetime64[ns] 1999-12-01 2000-03-01 2000-06-01 2000-09-01
Run Code Online (Sandbox Code Playgroud)

Jul*_*les 5

正如文档(http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html)中所说,您可以skipna根据您希望如何处理 nans 进行指定。

在你的情况下,指定skipna = False会做到这一点。由于resample最近已修改为延迟计算,您可以通过两种方式进行:

da.resample(time="QS-DEC").sum(skipna=False)
Run Code Online (Sandbox Code Playgroud)

或者旧的方式(你把所有东西都放在里面.resample()):

da.resample("QS-DEC", 'time', how='sum', skipna=False)
Run Code Online (Sandbox Code Playgroud)