我有许多每日 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 区域的情况下重新采样我的数据。 ?
答案 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