xarray 中的切片给出错误 'float' object cannot be interpreted as an integer

slice in xarray gives error 'float' object cannot be interpreted as an integer

我正在尝试使用 xarray 按经度 slice 数据。 数据位于我根据所做的测量创建的 netcdf 文件中。

xarray.Dataset 具有以下属性:

尺寸:

(纬度:1321,经度:1321)

数据变量:

  1. (lon) float64 '8.413 8.411 8.409 ... 4.904 4.905'
  2. (lat) float64 '47.4 47.4 47.41 ... 52.37 52.37'
  3. (数据) float64 ... #dimension: 1321

我的代码是:

import xarray as xr
obs = xr.open_dataset('data.nc')
obs=obs['data'].sel(lon=slice(4.905, 8.413))

我得到的错误是TypeError: 'float' object cannot be interpreted as an integer

我无法确定是我的代码错误,还是xarray 错误。我希望使用 isel 而不是 sel 会出现这样的错误。无法在此处或 the xarray documentation.

找到任何解决方案

完整的错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-434-5b37e4c5d0c6> in <module>
----> 1 obs=obs['data'].sel(lon=slice(4.905, 8.413))

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataarray.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   1059             method=method,
   1060             tolerance=tolerance,
-> 1061             **indexers_kwargs,
   1062         )
   1063         return self._from_temp_dataset(ds)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   2066             self, indexers=indexers, method=method, tolerance=tolerance
   2067         )
-> 2068         result = self.isel(indexers=pos_indexers, drop=drop)
   2069         return result._overwrite_indexes(new_indexes)
   2070 

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py in isel(self, indexers, drop, **indexers_kwargs)
   1933             var_indexers = {k: v for k, v in indexers.items() if k in var_value.dims}
   1934             if var_indexers:
-> 1935                 var_value = var_value.isel(var_indexers)
   1936                 if drop and var_value.ndim == 0 and var_name in coord_names:
   1937                     coord_names.remove(var_name)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in isel(self, indexers, **indexers_kwargs)
   1058 
   1059         key = tuple(indexers.get(dim, slice(None)) for dim in self.dims)
-> 1060         return self[key]
   1061 
   1062     def squeeze(self, dim=None):

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in __getitem__(self, key)
    701         array `x.values` directly.
    702         """
--> 703         dims, indexer, new_order = self._broadcast_indexes(key)
    704         data = as_indexable(self._data)[indexer]
    705         if new_order:

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in _broadcast_indexes(self, key)
    540 
    541         if all(isinstance(k, BASIC_INDEXING_TYPES) for k in key):
--> 542             return self._broadcast_indexes_basic(key)
    543 
    544         self._validate_indexers(key)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/variable.py in _broadcast_indexes_basic(self, key)
    568             dim for k, dim in zip(key, self.dims) if not isinstance(k, integer_types)
    569         )
--> 570         return dims, BasicIndexer(key), None
    571 
    572     def _validate_indexers(self, key):

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in __init__(self, key)
    369                 k = int(k)
    370             elif isinstance(k, slice):
--> 371                 k = as_integer_slice(k)
    372             else:
    373                 raise TypeError(

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in as_integer_slice(value)
    344 
    345 def as_integer_slice(value):
--> 346     start = as_integer_or_none(value.start)
    347     stop = as_integer_or_none(value.stop)
    348     step = as_integer_or_none(value.step)

~/opt/anaconda3/lib/python3.7/site-packages/xarray/core/indexing.py in as_integer_or_none(value)
    340 
    341 def as_integer_or_none(value):
--> 342     return None if value is None else operator.index(value)
    343 
    344 

我想要 select 整个数据,因为最终我想从具有更宽网格的更大数据库中减去整个数组。这个更大的数据库也是一个 NETCDF 文件。对于那个,我设法用我在这个较小的数据集上尝试的完全相同的代码对经度进行切片,但我得到了错误。唯一的区别是更大的 NETCDF 使用 float32 格式。我不怀疑这会导致错误。

感谢任何帮助。谢谢。

我想我找到了问题所在。 当我创建用于观察的 netcdf 文件时,我在命名 lon 和 lat 数据时在 createDimension 部分犯了一个错误。因此,lat 和 lon 出现在 netcdf 文件中的 'Data variables' 下,它们应该出现在 'Coordinates'

错误的是:

#Specifying dimensions#
f.createDimension('longitude', len(lon_list))
f.createDimension('latitude', len(lat_list))
#Building variables
longitude = f.createVariable('lon', float, ('lon',), zlib=True)
latitude = f.createVariable('lat', float, ('lat',), zlib=True)  

data = f.createVariable('data', float, ('lat','lon'), zlib=True)

正确的是:

#Specifying dimensions#
f.createDimension('lon', len(lon_list))
f.createDimension('lat', len(lat_list))
#Building variables
longitude = f.createVariable('lon', float, ('lon',), zlib=True)
latitude = f.createVariable('lat', float, ('lat',), zlib=True)  

data = f.createVariable('data', float, ('lat','lon'), zlib=True)