numpy 将.sum()用于流域NetCDF文件时处理Xarray中的NAN值

v1uwarro  于 2023-10-19  发布在  Etcd
关注(0)|答案(1)|浏览(189)

下面的代码将包含每日数据的全球降水NetCDF文件和流域形状文件作为输入数据。降水量数据将像在ArcGIS或QGIS中使用盆地形状文件一样进行裁剪。到目前为止还不错。
但是,在最后一行中有一个问题:sum_data = clipped_nc.resample({"time": "month"}).sum(keep_attrs=True, skipna=True).这里,我想得到月降水量。
问题是,在求和之前盆地之外的所有值都是NaN值,但一旦我计算sum_data,NaN值就变成了零。
我知道在最后一行中有skipna=True。我决定保持它是真的,因为有时我会遇到流域内的降水数据(NaN)缺失,当我将真实的测量数据与缺失数据相加时,我得到的结果是NaN。所以我通过执行skipna=True解决了这个问题,结果是现在我遇到了我刚才提到的问题,流域外的值为零而不是NaN。

这是代码:

import geopandas as gpd
import rioxarray
import xarray as xr
import matplotlib.pyplot as plt
from shapely.geometry import mapping

# Load shapefile
shapefile_path = "my_shapefile.shp"
shapefile = gpd.read_file(shapefile_path, crs="epsg:4326")

# Load NetCDF file
netcdf_path = "my_netcdffile.nc"
ds = xr.open_dataset(netcdf_path)

pre = ds["pre"] # selecting precipitation

# clipping
pre.rio.set_spatial_dims(x_dim="lon", y_dim="lat", inplace=True)
pre.rio.write_crs("epsg:4326", inplace=True)
basin = pre.rio.clip(
    shapefile.geometry.apply(mapping), pre.rio.crs
)

sum_data =  basin.resample({"time": "month"}).sum(keep_attrs=True, skipna=True)

我附上了两张照片
sum_data之前的NetCDF文件,其中盆外的所有值均为-9999:

sum_data之后的NetCDF文件,其中盆外的所有值均为0:

正如您所看到的,盆地外部的NaN值对于sum_data来说是混乱的。我不知道如何将流域外的NaN值保持为NaN,同时忽略流域内可能的NaN值进行计算,例如求和、均值、方差等。
有人知道吗?

dm7nw8vv

dm7nw8vv1#

我采纳了@瓦尔的建议解决了这个问题。
下面是之前发布的代码的最后一部分,其中有两行新代码修复了我的问题:

basin = pre.rio.clip(
    shapefile.geometry.apply(mapping), pre.rio.crs
)

basin_mask = ~np.isnan(basin)

sum_data =  basin.resample({"time": "month"}).sum(keep_attrs=True)    

sum_data = sum_data.where(basin_mask)

相关问题