下面的代码将包含每日数据的全球降水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值进行计算,例如求和、均值、方差等。
有人知道吗?
1条答案
按热度按时间dm7nw8vv1#
我采纳了@瓦尔的建议解决了这个问题。
下面是之前发布的代码的最后一部分,其中有两行新代码修复了我的问题: