xarray中的切片给出错误“ float”对象无法解释为整数

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

我正在尝试使用slice通过经度xarray进行数据。数据在我根据测量结果创建的netcdf文件中。

xarray.Dataset具有以下属性:

尺寸:

(lat:1321,lon: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. [(data)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 

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

感谢您的帮助。谢谢。

python-3.x numpy slice netcdf python-xarray
1个回答
1
投票

我想我找到了问题。当创建用于观察的netcdf文件时,在命名lon和lat数据时,在createDimension部分中犯了一个错误。因此,lat和lon显示在netcdf文件的“数据变量”下,它们应显示在“坐标”下。

错误是类似的:

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