@@ -1029,6 +1029,10 @@ def isin(self, test_elements):
1029
1029
mapped_test_elements .append (flag_dict [elem ])
1030
1030
return self ._obj .isin (mapped_test_elements )
1031
1031
1032
+ def _drop_missing_variables (self , variables : List [str ]) -> List [str ]:
1033
+
1034
+ return [var for var in variables if var in self ._obj or var in self ._obj .coords ]
1035
+
1032
1036
def _get_all_cell_measures (self ):
1033
1037
"""
1034
1038
Get all cell measures defined in the object, adding CF pre-defined measures.
@@ -1383,7 +1387,9 @@ def cell_measures(self) -> Dict[str, List[str]]:
1383
1387
keys = {}
1384
1388
for attr in all_attrs :
1385
1389
keys .update (parse_cell_methods_attr (attr ))
1386
- measures = {key : _get_all (self ._obj , key ) for key in keys }
1390
+ measures = {
1391
+ key : self ._drop_missing_variables (_get_all (self ._obj , key )) for key in keys
1392
+ }
1387
1393
1388
1394
return {k : sorted (set (v )) for k , v in measures .items () if v }
1389
1395
@@ -1877,9 +1883,15 @@ def formula_terms(self) -> Dict[str, Dict[str, str]]:
1877
1883
Property that returns a dictionary
1878
1884
{parametric_coord_name: {standard_term_name: variable_name}}
1879
1885
"""
1880
- return {
1881
- dim : self ._obj [dim ].cf .formula_terms for dim in _get_dims (self ._obj , "Z" )
1882
- }
1886
+ results = {}
1887
+ for dim in _get_dims (self ._obj , "Z" ):
1888
+ terms = self ._obj [dim ].cf .formula_terms
1889
+ variables = self ._drop_missing_variables (list (terms .values ()))
1890
+ terms = {key : val for key , val in terms .items () if val in variables }
1891
+ if terms :
1892
+ results [dim ] = terms
1893
+
1894
+ return results
1883
1895
1884
1896
@property
1885
1897
def bounds (self ) -> Dict [str , List [str ]]:
@@ -1896,12 +1908,15 @@ def bounds(self) -> Dict[str, List[str]]:
1896
1908
keys = self .keys () | set (obj .variables )
1897
1909
1898
1910
vardict = {
1899
- key : apply_mapper (_get_bounds , obj , key , error = False ) for key in keys
1911
+ key : self ._drop_missing_variables (
1912
+ apply_mapper (_get_bounds , obj , key , error = False )
1913
+ )
1914
+ for key in keys
1900
1915
}
1901
1916
1902
1917
return {k : sorted (v ) for k , v in vardict .items () if v }
1903
1918
1904
- def get_bounds (self , key : str ) -> DataArray :
1919
+ def get_bounds (self , key : str ) -> Union [ DataArray , Dataset ] :
1905
1920
"""
1906
1921
Get bounds variable corresponding to key.
1907
1922
@@ -1915,7 +1930,11 @@ def get_bounds(self, key: str) -> DataArray:
1915
1930
DataArray
1916
1931
"""
1917
1932
1918
- return apply_mapper (_variables (_single (_get_bounds )), self ._obj , key )[0 ]
1933
+ results = self .bounds .get (key , [])
1934
+ if not results :
1935
+ raise KeyError (f"No results found for { key !r} ." )
1936
+
1937
+ return self ._obj [results [0 ] if len (results ) == 1 else results ]
1919
1938
1920
1939
def get_bounds_dim_name (self , key : str ) -> str :
1921
1940
"""
0 commit comments