Xarray按纬度坐标切片返回空维度的问题及解决方法
Xarray按纬度坐标切片返回空数组问题解决
问题表现
处理气候模拟模型输出的NC数据时,使用Xarray的sel方法按纬度坐标切片返回空数组,但经度切片逻辑完全相同可以正常返回结果。
读取数据代码
xr.open_mfdataset(nc_list[1])
读取到的数据集核心坐标信息如下:
<xarray.Dataset> Dimensions: (bnds: 2, time: 1128, lev: 13, lat: 360, lon: 720) Coordinates: * lat (lat) float64 89.75 89.25 88.75 ... -88.75 -89.25 -89.75 * lon (lon) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8
异常复现
经度切片正常运行:
xr.open_mfdataset(nc_list[1]).sel(lon=slice(0, 100))
返回结果保留200个有效lon维度值。
纬度切片返回空:
xr.open_mfdataset(nc_list[1]).sel(lat=slice(0, 100))
返回结果lat维度长度为0,无匹配坐标。
问题原因
Xarray的sel方法使用slice做区间筛选时,会严格遵循坐标本身的排列顺序做匹配。
当前数据集的lon坐标是从西到东升序排列(值从小到大),所以slice(0,100)可以正常匹配到0到100经度的区间;但lat坐标是从北纬到南纬降序排列(值从大到小),slice(0,100)是按照从小到大的区间做匹配,找不到符合条件的坐标值,就返回空数组。
解决方法
方法1:适配降序坐标调整slice参数
直接反转slice的起止值,把区间高值放在前面,低值放在后面:
xr.open_dataset(path, decode_times=False).sel(lat=slice(100, 0))
即可正确匹配0°N到90°N的纬度区间。
方法2:通用兼容方案(推荐)
先对lat坐标做升序排序,之后就可以统一用从小到大的slice逻辑做切片,不用再记忆坐标排列顺序:
# 先对纬度坐标升序排序 ds = xr.open_mfdataset(nc_list[1]).sortby('lat') # 常规切片即可正常运行 ds_sel = ds.sel(lat=slice(0, 100))
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

