【问题标题】:How to select data from netcdf file by specific variable value?如何通过特定变量值从 netcdf 文件中选择数据?
【发布时间】:2022-01-11 21:03:47
【问题描述】:

我正在寻找从 NetCDF 文件中以特定变量值选择数据的选项。数据集包含时间、纬度和经度坐标以及一系列变量。其中一个变量是具有陆地/开阔海洋/海冰/湖泊的特定值的掩码。由于公海由 ds.mask = 1 表示,我只想提取位于 mask = 1 的坐标(时间和空间)的海面温度值。但是,我不希望海面温度值位于其他坐标设置为 NaN,但只保留 ds.mask = 1 的那些坐标和变量值。我知道如何使用 xarray.sel/isel 选择和数据,但是,这只适用于按坐标选择,而不是通过我正在尝试的变量值。任何帮助将不胜感激。

lati = stormtrack_lat.values
loni = stormtrack_lon.values
timei = stormtrack_datetime.values
tmax = timei.max() + np.timedelta64(10,'D')
tmin = timei.min() - np.timedelta64(10,'D')
SSTskin_subfile = SSTskin_file.sel(time=slice(tmin, tmax))

#HERE I NEED HELP:
#extract data where mask = ocean (1) and use only these data points and keep these only!
SSTskin_subfile_masked = SSTskin_subfile.sel(SSTskin_subfile.mask == 1) #does not work yet (Thrown error: ValueError: the first argument to .isel must be a dictionary)

这是 NetCDF 文件的结构:

【问题讨论】:

  • 请贴出你试过的代码
  • 我已经添加了我的代码。谢谢。

标签: python netcdf python-xarray


【解决方案1】:

您可以使用 .where 应用海洋遮罩:

SSTskin_subfile_masked = SSTskin_subfile.where(SSTskin_subfile.mask)

由于数据是网格化的,因此无法删除所有被屏蔽的点。例如,如果给定纬度只有一个定义值,则必须保留所有值。但是,您可以使用以下命令删除所有值均为 NaN 的坐标:

SSTskin_subfile_masked.dropna(dim = ['lat', 'lon'], how = 'all')

【讨论】:

  • 谢谢;我是否理解它会丢弃 mask = NaN 的坐标?
  • @user17681970 不完全是,.where() 会将 mask = 1 的值设置为 NaN。然后.dropna(dim = dim, how = 'all') 将删除所有值都是 NaN 的坐标,例如:如果有一个纬度所有值都是 NaN,它将被删除,但如果 NaN 和有效值混合,则不能只删除 NaN。
  • 好的,但是你的第一行代码需要是SSTskin_subfile_masked = SSTskin_subfile.where(SSTskin_subfile.mask ==1),不是吗?
  • @user17681970 两者都应该工作,因为 Python 将 1 解释为 True(即:1 == True 为 True)。
  • 好的,非常感谢;由于您在上面解释的条件,我认为这不是我要走的路。我会尝试找到另一种方法来解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多