对盆地 NetCDF 文件使用 .sum() 时处理 Xarray 中的 NAN 值

问题描述 投票:0回答:1

以下代码采用包含每日数据的全球降水 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 值进行求和、均值、方差等计算。

有人知道吗?

python numpy nan python-xarray shapefile
1个回答
0
投票
我按照@val的建议解决了这个问题。

这是之前发布的代码的最后一部分,其中有两行新行解决了我的问题:

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.