使用某些 nan 处理的 xarray 重采样
xarray resampling with certain nan treatment
问题:
我想重新采样 xarray 数据集,例如当至少一个输入值为 nan 时,每个结果值为 nan 的总和或平均值。使用 pandas,我可以轻松地应用自己的均值、求和等函数,为我提供首选的 nan 处理。 xarray 也允许 resample.apply(own_func) 但我在定义自己的函数时遇到问题。
示例 (from xarray's documentation):
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()
我得到的:
<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
@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
我想要的:
<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
如文档中所述 (http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html),您可以指定 skipna
,具体取决于您希望如何处理 nans。
在您的情况下,指定 skipna = False
即可。由于最近修改了 resample
以延迟计算,您可以通过两种方式进行:
da.resample(time="QS-DEC").sum(skipna=False)
或旧方法(将所有内容都放在 .resample()
中):
da.resample("QS-DEC", 'time', how='sum', skipna=False)
您可以使用 xarray resample
和 reduce
的组合:
#Dummy function to see the array grouping
def func(x, axis): #reduce expect a function with axis argument
print(x) #To see the array grouping
return x #Not relevant
da.resample(time="QS-DEC").reduce(func)
Nan 在第一节(不是你期望的第二节)
[ 0. 1. nan]
[3. 4. 5.]
[6. 7. 8.]
[ 9. 10. 11.]
因此,使用 np.sum()
与 nan 的输出是在第一季度:
import numpy as np
da.resample(time="QS-DEC").reduce(np.sum)
<xarray.DataArray (time: 4)>
array([nan, 12., 21., 30.])
Coordinates:
* time (time) datetime64[ns] 1999-12-01 2000-03-01 2000-06-01 2000-09-01
如果你想避免 nan,只需使用 np.nansum()
:
da.resample(time="QS-DEC").reduce(np.nansum)
<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
同样适用于np.mean(), np.nanmean(), np.std(), np,nanstd()
等
对于与reduce一起使用的更复杂的功能,你可以看到这个答案:
问题:
我想重新采样 xarray 数据集,例如当至少一个输入值为 nan 时,每个结果值为 nan 的总和或平均值。使用 pandas,我可以轻松地应用自己的均值、求和等函数,为我提供首选的 nan 处理。 xarray 也允许 resample.apply(own_func) 但我在定义自己的函数时遇到问题。
示例 (from xarray's documentation):
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()
我得到的:
<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
@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
我想要的:
<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
如文档中所述 (http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html),您可以指定 skipna
,具体取决于您希望如何处理 nans。
在您的情况下,指定 skipna = False
即可。由于最近修改了 resample
以延迟计算,您可以通过两种方式进行:
da.resample(time="QS-DEC").sum(skipna=False)
或旧方法(将所有内容都放在 .resample()
中):
da.resample("QS-DEC", 'time', how='sum', skipna=False)
您可以使用 xarray resample
和 reduce
的组合:
#Dummy function to see the array grouping
def func(x, axis): #reduce expect a function with axis argument
print(x) #To see the array grouping
return x #Not relevant
da.resample(time="QS-DEC").reduce(func)
Nan 在第一节(不是你期望的第二节)
[ 0. 1. nan]
[3. 4. 5.]
[6. 7. 8.]
[ 9. 10. 11.]
因此,使用 np.sum()
与 nan 的输出是在第一季度:
import numpy as np
da.resample(time="QS-DEC").reduce(np.sum)
<xarray.DataArray (time: 4)>
array([nan, 12., 21., 30.])
Coordinates:
* time (time) datetime64[ns] 1999-12-01 2000-03-01 2000-06-01 2000-09-01
如果你想避免 nan,只需使用 np.nansum()
:
da.resample(time="QS-DEC").reduce(np.nansum)
<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
同样适用于np.mean(), np.nanmean(), np.std(), np,nanstd()
等
对于与reduce一起使用的更复杂的功能,你可以看到这个答案: