进行某种nan处理的xarray重采样

时间:2019-01-31 13:21:07

标签: python pandas python-xarray

问题:
我想对xarray数据集进行重新采样当至少一个输入值是nan时,每个结果值均为nan的总和或平均值。使用熊猫,我可以轻松地应用自己的均值,求和等函数,从而获得我偏爱的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

2 个答案:

答案 0 :(得分:1)

如文档(http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html中所述),您可以根据想要处理nan的方式指定skipna

根据您的情况,指定skipna = False即可。由于resample最近已被修改以推迟计算,因此您可以通过两种方式进行操作:

da.resample(time="QS-DEC").sum(skipna=False)

或旧方法(将所有内容放入.resample()内)

da.resample("QS-DEC", 'time', how='sum', skipna=False)

答案 1 :(得分:1)

您可以结合使用xarray resamplereduce

#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一起使用的更复杂的功能,您可以看到以下答案: https://stackoverflow.com/a/60627663/6841963