将 netcdf 从每日重采样为每月保持 nan 值

Resampling netcdf from daily to monthly keeping nan values

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

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 的区域的情况下重新采样我的数据。 ?

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

所以代替:

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