【问题标题】:xarray resampling with certain nan treatment使用某些 nan 处理进行 xarray 重采样
【发布时间】:2019-01-31 13:21:06
【问题描述】:

问题:
我想重新采样一个 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

【问题讨论】:

    标签: python pandas python-xarray


    【解决方案1】:

    正如文档 (http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html) 中所说,您可以指定 skipna,具体取决于您希望如何处理 nan。

    在您的情况下,指定 skipna = False 即可。由于resample 最近被修改为延迟计算,您可以通过两种方式进行:

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

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

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

    【讨论】:

    • 否,skipnasays:在下采样聚合时是否跳过缺失值。我的示例是关于从月度数据上采样到季节性数据。
    • 不,你误解了“下采样”这个词。如果您从月度数据到季节性数据,您将从较高的分辨率转换到较低的分辨率,也就是说,您正在下采样。上采样将提高分辨率,例如,从季节性分辨率变为每月分辨率。
    • 谢谢,我把这两个弄混了!仍然 skipna 参数不能解决我的问题 - 我扩展了问题以显示这一点。
    • 对迟到的回复表示歉意。您必须将 skipna 参数放在 .sum() 操作中才能使其工作。我会修改我的答案以更清楚。
    【解决方案2】:

    您可以使用 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() 的输出是在第一季度:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      相关资源
      最近更新 更多