以下代码采用包含每日数据的全球降水 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
解决了这个问题,结果现在我遇到了我刚才提到的问题,盆地外的值为 ZEROS 而不是 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 值进行求和、均值、方差等计算。有人知道吗?
这是之前发布的代码的最后一部分,其中有两行新行解决了我的问题:
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)