1

I have been working on programming to plot Skew_Ts from Wyoming's weather servers. The issue I am having is I get an error when attempting to run the parcel_profile function, it says it can not convert from dimensionless to hectopascals. The pressure array being fed into the function as well as the temperature and dewpoint data point have the appropriate units attached though. To add to my confusion, I have the exact same coding on another machine with the same library versions and it runs fine on that one. Am I missing an obvious problem? Code and relevant library versions are listed below:

import metpy as mp
from metpy.units import units
import metpy.calc as mpcalc
from siphon.simplewebservice.wyoming import WyomingUpperAir
from datetime import datetime
import pandas as pd
import numpy as np

final_time = datetime(2022, 1, 21, 12)
station = 'ABQ'
df = WyomingUpperAir.request_data(final_time, station)

data_dict = {"Press":"", "Temp": "", "Dew_Point": "", "Height":"", 
              "Mask": "", "Parcel": "", "Idx": "", "U": "", "V": ""}

data_dict['Press'] = df['pressure'].values * units(df.units['pressure'])
data_dict['Temp'] = df['temperature'].values * units(df.units['temperature'])
data_dict['Dew_Point'] = df['dewpoint'].values * units(df.units['dewpoint'])
data_dict['Height'] = df['height'].values * units(df.units['height'])
data_dict['U'] = df['u_wind'].values * units(df.units['u_wind'])
data_dict['V'] = df['v_wind'].values * units(df.units['v_wind'])

data_dict['Parcel'] = mpcalc.parcel_profile(data_dict['Press'], 
                                                data_dict['Temp'][0], 
                                                data_dict['Dew_Point'][0]).to('degC')

Error:

DimensionalityError                       Traceback (most recent call last)
C:\Users\####################.py in <module>
----> 1 data_dict['Parcel'] = mpcalc.parcel_profile(data_dict['Press'], 
      2                                                 data_dict['Temp'][0],
      3                                                 data_dict['Dew_Point'][0]).to('degC')

~\anaconda3\envs\Met_World\lib\site-packages\metpy\xarray.py in wrapper(*args, **kwargs)
   1214 
   1215             # Evaluate inner calculation
-> 1216             result = func(*bound_args.args, **bound_args.kwargs)
   1217 
   1218             # Wrap output based on match and match_unit

~\anaconda3\envs\Met_World\lib\site-packages\metpy\units.py in wrapper(*args, **kwargs)
    244                                'that the function is being called properly.\n') + msg
    245                 raise ValueError(msg)
--> 246             return func(*args, **kwargs)
    247 
    248         return wrapper

~\anaconda3\envs\Met_World\lib\site-packages\metpy\calc\thermo.py in parcel_profile(pressure, temperature, dewpoint)
    737 
    738     """
--> 739     _, _, _, t_l, _, t_u = _parcel_profile_helper(pressure, temperature, dewpoint)
    740     return concatenate((t_l, t_u))
    741 

~\anaconda3\envs\Met_World\lib\site-packages\metpy\calc\thermo.py in _parcel_profile_helper(pressure, temperature, dewpoint)
    892 
    893     # If the pressure profile doesn't make it to the lcl, we can stop here
--> 894     if _greater_or_close(np.nanmin(pressure), press_lcl):
    895         return (press_lower[:-1], press_lcl, units.Quantity(np.array([]), press_lower.units),
    896                 temp_lower[:-1], temp_lcl, units.Quantity(np.array([]), temp_lower.units))

~\anaconda3\envs\Met_World\lib\site-packages\metpy\calc\tools.py in _greater_or_close(a, value, **kwargs)
    738 
    739     """
--> 740     return (a > value) | np.isclose(a, value, **kwargs)
    741 
    742 

~\anaconda3\envs\Met_World\lib\site-packages\pint\quantity.py in __array_ufunc__(self, ufunc, method, *inputs, **kwargs)
   1721         )
   1722 
-> 1723         return numpy_wrap("ufunc", ufunc, inputs, kwargs, types)
   1724 
   1725     def __array_function__(self, func, types, args, kwargs):

~\anaconda3\envs\Met_World\lib\site-packages\pint\numpy_func.py in numpy_wrap(func_type, func, args, kwargs, types)
    919     if name not in handled or any(is_upcast_type(t) for t in types):
    920         return NotImplemented
--> 921     return handled[name](*args, **kwargs)

~\anaconda3\envs\Met_World\lib\site-packages\pint\numpy_func.py in implementation(*args, **kwargs)
    284         if input_units == "all_consistent":
    285             # Match all input args/kwargs to same units
--> 286             stripped_args, stripped_kwargs = convert_to_consistent_units(
    287                 *args, pre_calc_units=first_input_units, **kwargs
    288             )

~\anaconda3\envs\Met_World\lib\site-packages\pint\numpy_func.py in convert_to_consistent_units(pre_calc_units, *args, **kwargs)
    105     """
    106     return (
--> 107         tuple(convert_arg(arg, pre_calc_units=pre_calc_units) for arg in args),
    108         {
    109             key: convert_arg(arg, pre_calc_units=pre_calc_units)

~\anaconda3\envs\Met_World\lib\site-packages\pint\numpy_func.py in <genexpr>(.0)
    105     """
    106     return (
--> 107         tuple(convert_arg(arg, pre_calc_units=pre_calc_units) for arg in args),
    108         {
    109             key: convert_arg(arg, pre_calc_units=pre_calc_units)

~\anaconda3\envs\Met_World\lib\site-packages\pint\numpy_func.py in convert_arg(arg, pre_calc_units)
     87                 return arg
     88             else:
---> 89                 raise DimensionalityError("dimensionless", pre_calc_units)
     90     elif _is_quantity(arg):
     91         return arg.m

DimensionalityError: Cannot convert from 'dimensionless' to 'hectopascal'

Libraries used: python 3.9.7 metpy 1.1.0 pandas 1.2.4 numpy 1.22.0 xarray 0.20.2

WX_Fast
  • 11
  • 2

1 Answers1

1

My first guess is that this is a problem with multiplying whatever e.g. df['u_wind'].values is returning by units. While it's a nicer syntax, the more robust way is to use the Quantity constructor:

data_dict['Press'] = units.Quantity(df['pressure'].values, units(df.units['pressure']))

You can shorten all of that, though, and use the Quantity() method by using MetPy's helper metpy.units.pandas_dataframe_to_unit_arrays:

data_dict = units.pandas_dataframe_to_unit_arrays(df)

If you want the column names you were originally using, you can change them with df.rename().

DopplerShift
  • 5,472
  • 1
  • 21
  • 20