将 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
我有许多来自水文模型的每日 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