如何为xarray.Dataset添加经纬度维度以使用.sel方法选点?
问题:基于非维度坐标的xarray点位选择
我有一个xarray.Dataset,结构如下:
<xarray.Dataset> Dimensions: (time: 365, y: 277, x: 349, nbnds: 2) Coordinates: * time (time) datetime64[ns] 1979-01-01 ... 1979-12-31 * y (y) float32 0.0 3.246e+04 ... 8.927e+06 8.96e+06 * x (x) float32 0.0 3.246e+04 ... 1.126e+07 1.13e+07 lat (y, x) float32 1.0 1.104 1.208 ... 46.93 46.64 46.35 lon (y, x) float32 -145.5 -145.3 -145.1 ... -2.644 -2.57 Dimensions without coordinates: nbnds Data variables: Lambert_Conformal int32 ... time_bnds (time, nbnds) float64 ... acpcp (time, y, x) float32 ... Attributes: (12/17) Conventions: CF-1.2 centerlat: 50.0 centerlon: -107.0 comments: institution: National Centers for Environmental Prediction latcorners: [ 1.000001 0.897945 46.3544 46.63433 ] ... ... history: created Mon Mar 21 17:56:47 MDT 2016 by ... dataset_title: NCEP North American Regional Reanalysis references: https://www.esrl.noaa.gov/psd/data/gridded/data.narr.html source: http://www.emc.ncep.noaa.gov/mmb/rreanl/ _NCProperties: version=2,netcdf=4.6.3,hdf5=1.10.5 DODS_EXTRA.Unlimited_Dimension: time
尝试用.sel方法基于lat和lon选择指定点位:
ds.sel(lat=point_lat, lon=point_lon, method='nearest')
但报错:KeyError: 'no index found for coordinate lat',已知lat是坐标但并非维度。请问实现该需求的最佳方式是什么?能否直接将lat和lon添加为维度?
解答
能否直接将lat和lon设为维度?
不能。因为lat和lon是二维坐标数组(每个(y,x)网格点对应唯一的经纬度值),而xarray的维度要求是一维、单调且每个维度值对应唯一的位置,二维坐标无法满足维度的定义,因此不能直接将lat/lon设为维度。
最佳实现方式
推荐通过计算目标经纬度与网格点的距离,找到最近点的索引后用isel选择,具体步骤如下:
import numpy as np import xarray as xr # 加载数据集 ds = xr.open_dataset("https://psl.noaa.gov/thredds/dodsC/Datasets/NARR/Dailies/monolevel/acpcp.1979.nc") # 定义目标点位 point_lat = 40.0 point_lon = -100.0 # 计算每个网格点到目标点的距离(简化用欧氏距离,如需更高精度可改用球面距离) distance = (ds.lat - point_lat)**2 + (ds.lon - point_lon)**2 # 找到距离最小点的一维索引,再转换为(y,x)二维索引 min_flat_idx = distance.argmin().item() y_idx, x_idx = np.unravel_index(min_flat_idx, ds.lat.shape) # 选择目标点位的数据 selected_point = ds.isel(y=y_idx, x=x_idx)
如果需要批量选择多个点位,可以将上述逻辑封装为函数,循环处理每个目标点即可。
内容的提问来源于stack exchange,提问作者pbreach
相关产品推荐
相关产品推荐

