@@ -201,21 +201,23 @@ def _apply_single_mapper(mapper):
201
201
for mapper in mappers :
202
202
results .append (_apply_single_mapper (mapper ))
203
203
204
- nresults = sum ([bool (v ) for v in results ])
205
- if nresults > 1 :
206
- raise KeyError (
207
- f"Multiple mappers succeeded with key { key !r} .\n I was using mappers: { mappers !r} ."
208
- f"I received results: { results !r} .\n Please open an issue."
209
- )
210
- if nresults == 0 :
204
+ flat = list (itertools .chain (* results ))
205
+ # de-duplicate
206
+ if all (not isinstance (r , DataArray ) for r in flat ):
207
+ results = list (set (flat ))
208
+ else :
209
+ results = flat
210
+
211
+ nresults = any ([bool (v ) for v in [results ]])
212
+ if not nresults :
211
213
if error :
212
214
raise KeyError (
213
215
f"cf-xarray cannot interpret key { key !r} . Perhaps some needed attributes are missing."
214
216
)
215
217
else :
216
218
# none of the mappers worked. Return the default
217
219
return default
218
- return list ( itertools . chain ( * results ))
220
+ return results
219
221
220
222
221
223
def _get_axis_coord_single (var : Union [DataArray , Dataset ], key : str ) -> List [str ]:
@@ -370,6 +372,21 @@ def _get_measure(obj: Union[DataArray, Dataset], key: str) -> List[str]:
370
372
return list (results )
371
373
372
374
375
+ def _get_with_standard_name (
376
+ obj : Union [DataArray , Dataset ], name : Union [str , List [str ]]
377
+ ) -> List [str ]:
378
+ """ returns a list of variable names with standard name == name. """
379
+ varnames = []
380
+ if isinstance (obj , DataArray ):
381
+ obj = obj ._to_temp_dataset ()
382
+ for vname , var in obj .variables .items ():
383
+ stdname = var .attrs .get ("standard_name" , None )
384
+ if stdname == name :
385
+ varnames .append (str (vname ))
386
+
387
+ return varnames
388
+
389
+
373
390
#: Default mappers for common keys.
374
391
_DEFAULT_KEY_MAPPERS : Mapping [str , Tuple [Mapper , ...]] = {
375
392
"dim" : (_get_axis_coord ,),
@@ -385,24 +402,18 @@ def _get_measure(obj: Union[DataArray, Dataset], key: str) -> List[str]:
385
402
"dims_or_levels" : (_get_axis_coord ,), # reset_index
386
403
"window" : (_get_axis_coord ,), # rolling_exp
387
404
"coord" : (_get_axis_coord_single ,), # differentiate, integrate
388
- "group" : (_get_axis_coord_single , _get_axis_coord_time_accessor ),
405
+ "group" : (
406
+ _get_axis_coord_single ,
407
+ _get_axis_coord_time_accessor ,
408
+ _get_with_standard_name ,
409
+ ),
389
410
"indexer" : (_get_axis_coord_single ,), # resample
390
- "variables" : (_get_axis_coord ,), # sortby
411
+ "variables" : (_get_axis_coord , _get_with_standard_name ), # sortby
391
412
"weights" : (_get_measure_variable ,), # type: ignore
413
+ "chunks" : (_get_axis_coord ,), # chunk
392
414
}
393
415
394
416
395
- def _get_with_standard_name (ds : Dataset , name : Union [str , List [str ]]) -> List [str ]:
396
- """ returns a list of variable names with standard name == name. """
397
- varnames = []
398
- for vname , var in ds .variables .items ():
399
- stdname = var .attrs .get ("standard_name" , None )
400
- if stdname == name :
401
- varnames .append (str (vname ))
402
-
403
- return varnames
404
-
405
-
406
417
def _guess_bounds_dim (da ):
407
418
"""
408
419
Guess bounds values given a 1D coordinate variable.
0 commit comments