87
87
_check_inplace ,
88
88
_default ,
89
89
decode_numpy_dict_values ,
90
+ drop_dims_from_indexers ,
90
91
either_dict_or_kwargs ,
91
92
hashable ,
92
93
infix_dims ,
@@ -1767,7 +1768,7 @@ def maybe_chunk(name, var, chunks):
1767
1768
return self ._replace (variables )
1768
1769
1769
1770
def _validate_indexers (
1770
- self , indexers : Mapping [Hashable , Any ]
1771
+ self , indexers : Mapping [Hashable , Any ], missing_dims : str = "raise" ,
1771
1772
) -> Iterator [Tuple [Hashable , Union [int , slice , np .ndarray , Variable ]]]:
1772
1773
""" Here we make sure
1773
1774
+ indexer has a valid keys
@@ -1777,9 +1778,7 @@ def _validate_indexers(
1777
1778
"""
1778
1779
from .dataarray import DataArray
1779
1780
1780
- invalid = indexers .keys () - self .dims .keys ()
1781
- if invalid :
1782
- raise ValueError ("dimensions %r do not exist" % invalid )
1781
+ indexers = drop_dims_from_indexers (indexers , self .dims , missing_dims )
1783
1782
1784
1783
# all indexers should be int, slice, np.ndarrays, or Variable
1785
1784
for k , v in indexers .items ():
@@ -1875,6 +1874,7 @@ def isel(
1875
1874
self ,
1876
1875
indexers : Mapping [Hashable , Any ] = None ,
1877
1876
drop : bool = False ,
1877
+ missing_dims : str = "raise" ,
1878
1878
** indexers_kwargs : Any ,
1879
1879
) -> "Dataset" :
1880
1880
"""Returns a new dataset with each array indexed along the specified
@@ -1896,6 +1896,12 @@ def isel(
1896
1896
drop : bool, optional
1897
1897
If ``drop=True``, drop coordinates variables indexed by integers
1898
1898
instead of making them scalar.
1899
+ missing_dims : {"raise", "warn", "ignore"}, default "raise"
1900
+ What to do if dimensions that should be selected from are not present in the
1901
+ Dataset:
1902
+ - "exception": raise an exception
1903
+ - "warning": raise a warning, and ignore the missing dimensions
1904
+ - "ignore": ignore the missing dimensions
1899
1905
**indexers_kwargs : {dim: indexer, ...}, optional
1900
1906
The keyword arguments form of ``indexers``.
1901
1907
One of indexers or indexers_kwargs must be provided.
@@ -1918,13 +1924,11 @@ def isel(
1918
1924
"""
1919
1925
indexers = either_dict_or_kwargs (indexers , indexers_kwargs , "isel" )
1920
1926
if any (is_fancy_indexer (idx ) for idx in indexers .values ()):
1921
- return self ._isel_fancy (indexers , drop = drop )
1927
+ return self ._isel_fancy (indexers , drop = drop , missing_dims = missing_dims )
1922
1928
1923
1929
# Much faster algorithm for when all indexers are ints, slices, one-dimensional
1924
1930
# lists, or zero or one-dimensional np.ndarray's
1925
- invalid = indexers .keys () - self .dims .keys ()
1926
- if invalid :
1927
- raise ValueError ("dimensions %r do not exist" % invalid )
1931
+ indexers = drop_dims_from_indexers (indexers , self .dims , missing_dims )
1928
1932
1929
1933
variables = {}
1930
1934
dims : Dict [Hashable , Tuple [int , ...]] = {}
@@ -1958,10 +1962,16 @@ def isel(
1958
1962
file_obj = self ._file_obj ,
1959
1963
)
1960
1964
1961
- def _isel_fancy (self , indexers : Mapping [Hashable , Any ], * , drop : bool ) -> "Dataset" :
1965
+ def _isel_fancy (
1966
+ self ,
1967
+ indexers : Mapping [Hashable , Any ],
1968
+ * ,
1969
+ drop : bool ,
1970
+ missing_dims : str = "raise" ,
1971
+ ) -> "Dataset" :
1962
1972
# Note: we need to preserve the original indexers variable in order to merge the
1963
1973
# coords below
1964
- indexers_list = list (self ._validate_indexers (indexers ))
1974
+ indexers_list = list (self ._validate_indexers (indexers , missing_dims ))
1965
1975
1966
1976
variables : Dict [Hashable , Variable ] = {}
1967
1977
indexes : Dict [Hashable , pd .Index ] = {}
0 commit comments