-
Notifications
You must be signed in to change notification settings - Fork 447
Labels
Area: UnitsPertains to unit informationPertains to unit informationType: EnhancementEnhancement to existing functionalityEnhancement to existing functionality
Milestone
Description
What went wrong?
Hello everyone!
I want to create a radar reflectivity profile, but I encountered an issue when using the cross_section function. It seems that the unit 'dBZ' for reflectivity is not defined, although the dataset used has already defined its unit. I would like to know the reason for this problem and hope that you can provide assistance.

Operating System
Windows
Version
1.6.0
Python Version
3.11.4
Code to Reproduce
da = xr.open_dataset(r'E:\data\0415\20210415_090551_vdras.nc')
data = da.metpy.assign_crs(
grid_mapping_name='lambert_conformal_conic',
latitude_of_projection_origin=39.808887,
longitude_of_central_meridian=116.47195,
standard_parallel=39.808887,
earth_radius=6371.229
).metpy.assign_latitude_longitude()
start = (116.6,39.87)
end = (117.03,39.6)
print(data)
cross = cross_section(data, start, end).set_coords(('lat', 'lon'))Errors, Traceback, and Logs
UndefinedUnitError Traceback (most recent call last)
Cell In[75], line 12
10 end = (117.03,39.6)
11 print(data)
---> 12 cross = cross_section(data, start, end).set_coords(('lat', 'lon'))
File d:\anaconda3\Lib\site-packages\metpy\interpolate\slices.py:147, in cross_section(data, start, end, steps, interp_type)
109 r"""Obtain an interpolated cross-sectional slice through gridded data.
110
111 Utilizing the interpolation functionality in xarray, this function takes a vertical
(...)
143
144 """
145 if isinstance(data, xr.Dataset):
146 # Recursively apply to dataset
--> 147 return data.map(cross_section, True, (start, end), steps=steps,
148 interp_type=interp_type)
149 elif data.ndim == 0:
150 # This has no dimensions, so it is likely a projection variable. In any case, there
151 # are no data here to take the cross section with. Therefore, do nothing.
152 return data
File d:\anaconda3\Lib\site-packages\xarray\core\dataset.py:6037, in Dataset.map(self, func, keep_attrs, args, **kwargs)
6035 if keep_attrs is None:
6036 keep_attrs = _get_keep_attrs(default=False)
-> 6037 variables = {
6038 k: maybe_wrap_array(v, func(v, *args, **kwargs))
6039 for k, v in self.data_vars.items()
6040 }
6041 if keep_attrs:
6042 for k, v in variables.items():
File d:\anaconda3\Lib\site-packages\xarray\core\dataset.py:6038, in <dictcomp>(.0)
6035 if keep_attrs is None:
6036 keep_attrs = _get_keep_attrs(default=False)
6037 variables = {
-> 6038 k: maybe_wrap_array(v, func(v, *args, **kwargs))
6039 for k, v in self.data_vars.items()
6040 }
6041 if keep_attrs:
6042 for k, v in variables.items():
File d:\anaconda3\Lib\site-packages\metpy\interpolate\slices.py:173, in cross_section(data, start, end, steps, interp_type)
170 points_cross[points_cross[:, 0] < 0, 0] += 360.
172 # Return the interpolated data
--> 173 return interpolate_to_slice(data, points_cross, interp_type=interp_type)
File d:\anaconda3\Lib\site-packages\metpy\interpolate\slices.py:59, in interpolate_to_slice(data, points, interp_type)
53 data_sliced = data.interp({
54 x.name: xr.DataArray(points[:, 0], dims='index', attrs=x.attrs),
55 y.name: xr.DataArray(points[:, 1], dims='index', attrs=y.attrs)
56 }, method=interp_type)
57 data_sliced.coords['index'] = range(len(points))
---> 59 return data_sliced.metpy.quantify()
File d:\anaconda3\Lib\site-packages\metpy\xarray.py:235, in MetPyDataArrayAccessor.quantify(self)
222 """Return a new DataArray with the data converted to a `pint.Quantity`.
223
224 Notes
(...)
228 subsetting!
229 """
230 if (
231 not is_quantity(self._data_array.data)
232 and np.issubdtype(self._data_array.data.dtype, np.number)
233 ):
234 # Only quantify if not already quantified and is quantifiable
--> 235 quantified_dataarray = self._data_array.copy(data=self.unit_array)
236 if 'units' in quantified_dataarray.attrs:
237 del quantified_dataarray.attrs['units']
File d:\anaconda3\Lib\site-packages\metpy\xarray.py:165, in MetPyDataArrayAccessor.unit_array(self)
163 return self._data_array.data
164 else:
--> 165 return units.Quantity(self._data_array.data, self.units)
File d:\anaconda3\Lib\site-packages\metpy\xarray.py:142, in MetPyDataArrayAccessor.units(self)
140 else:
141 default_unit = 'dimensionless'
--> 142 return units.parse_units(self._data_array.attrs.get('units', default_unit))
File d:\anaconda3\Lib\site-packages\pint\facets\plain\registry.py:1189, in GenericPlainRegistry.parse_units(self, input_string, as_delta, case_sensitive)
1161 def parse_units(
1162 self,
1163 input_string: str,
1164 as_delta: Optional[bool] = None,
1165 case_sensitive: Optional[bool] = None,
1166 ) -> UnitT:
1167 """Parse a units expression and returns a UnitContainer with
1168 the canonical names.
1169
(...)
1185
1186 """
1188 return self.Unit(
-> 1189 self.parse_units_as_container(input_string, as_delta, case_sensitive)
1190 )
File d:\anaconda3\Lib\site-packages\pint\facets\nonmultiplicative\registry.py:70, in GenericNonMultiplicativeRegistry.parse_units_as_container(self, input_string, as_delta, case_sensitive)
67 if as_delta is None:
68 as_delta = self.default_as_delta
---> 70 return super().parse_units_as_container(input_string, as_delta, case_sensitive)
File d:\anaconda3\Lib\site-packages\pint\facets\plain\registry.py:1204, in GenericPlainRegistry.parse_units_as_container(self, input_string, as_delta, case_sensitive)
1198 as_delta = (
1199 as_delta if as_delta is not None else True
1200 ) # TODO This only exists in nonmultiplicative
1201 case_sensitive = (
1202 case_sensitive if case_sensitive is not None else self.case_sensitive
1203 )
-> 1204 return self._parse_units_as_container(input_string, as_delta, case_sensitive)
File d:\anaconda3\Lib\site-packages\pint\facets\plain\registry.py:1239, in GenericPlainRegistry._parse_units_as_container(self, input_string, as_delta, case_sensitive)
1237 many = len(units) > 1
1238 for name in units:
-> 1239 cname = self.get_name(name, case_sensitive=case_sensitive)
1240 value = units[name]
1241 if not cname:
File d:\anaconda3\Lib\site-packages\pint\facets\plain\registry.py:647, in GenericPlainRegistry.get_name(self, name_or_alias, case_sensitive)
645 candidates = self.parse_unit_name(name_or_alias, case_sensitive)
646 if not candidates:
--> 647 raise UndefinedUnitError(name_or_alias)
649 prefix, unit_name, _ = candidates[0]
650 if len(candidates) > 1:
UndefinedUnitError: 'dBZ' is not defined in the unit registryMetadata
Metadata
Assignees
Labels
Area: UnitsPertains to unit informationPertains to unit informationType: EnhancementEnhancement to existing functionalityEnhancement to existing functionality