从每天到每月重新采样 netcdf 保持 nan 值

时间:2021-05-14 03:35:18

标签: python-3.x netcdf python-xarray resampling

我有许多每日 NetCDF 来自水文模型,我想通过对它们求和或求平均值将它们转换为月/年水平。为此,我使用以下代码:

import xarray as xr
    
nc_file = r'J:\RESULTS\WB_PRECIPITATION.nc'
ds = xr.open_dataset(nc_file)
monthly_data=ds.resample(time='Y',skipna=True).sum()
output = r'J:\RESULTS\WB_PRECIPITATION_YEARLY.nc'
monthly_data.to_netcdf(output, engine="netcdf4")

问题是我的原始每日文件有几个区域为 nan (_FillValue=-9999),当它们传递给新的 NetCDF 时,它们传递的值为 0。在这种情况下,这会扭曲所有计算。

我已经用 True 和 False 值检查了“skipna”参数,我得到了相同的结果。

在 Pandas 中,当我遇到同样的问题时,我使用了以下代码,但是,我无法针对这种情况进行调整。

import numpy as np
import pandas as pd 

def very_sum(array_like):
    if any(pd.isnull(array_like)):
        return np.nan
    else:
        return array_like.sum()

df = ... 
df_yearly = df.resample('Y').apply(very_sum)

如何在不丢失 nan 区域的情况下重新采样我的数据。 ?

1 个答案:

答案 0 :(得分:1)

我认为您只是放错了 skipna 关键字,它属于方法而不是重采样。这基本上是以下内容的重复:xarray resampling with certain nan treatment

所以代替:

monthly_data=ds.resample(time='Y',skipna=True).sum()

就去做:

monthly_data=ds.resample(time='Y').sum(skipna=False)

作为一个可运行的例子:

import numpy as np
import pandas as pd
import xarray as xr

time = pd.date_range("2000-01-01", "2000-12-31")
da = xr.DataArray(data=np.ones(time.size), coords={"time": time}, dims=["time"])
da.data[:45] = np.nan

默认:

da.resample(time="m").sum()

<xarray.DataArray (time: 12)>
array([ 0., 15., 31., 30., 31., 30., 31., 31., 30., 31., 30., 31.])
Coordinates:
  * time     (time) datetime64[ns] 2000-01-31 2000-02-29 ... 2000-12-31

skipna=False

da.resample(time="m").sum(skipna=False)

<xarray.DataArray (time: 12)>
array([nan, nan, 31., 30., 31., 30., 31., 31., 30., 31., 30., 31.])
Coordinates:
  * time     (time) datetime64[ns] 2000-01-31 2000-02-29 ... 2000-12-31