Unidata / MetPy

MetPy is a collection of tools in Python for reading, visualizing and performing calculations with weather data.
https://unidata.github.io/MetPy/
BSD 3-Clause "New" or "Revised" License
1.25k stars 414 forks source link

Inconsistent parsing of longitudes across cpu architectures #3392

Closed stackjohn closed 8 months ago

stackjohn commented 8 months ago

What went wrong?

Hello, thank you once again for metpy.

I'm seeing some strangeness when parsing grib2 files across architectures. I'm not sure what the expected behaviour should be, or how to make it consistent. For example, lets say I have the following test file, with an example grib2 file I found to help demonstrate:

import xarray as xr
import subprocess
import requests

url = 'https://github.com/SciTools/iris-test-data/raw/master/test_data/GRIB/global_t/global.grib2'
r = requests.get(url, allow_redirects=True)
open('global.grib2', 'wb').write(r.content)

command_one = f'wgrib2 global.grib2 -new_grid_winds earth -new_grid latlon 257:104:1.0 27:52:1 globalone.grib2'
subprocess.run(command_one, shell=True, check=True)
#Diplay grid from wgrib2 point of view
command_grid_1 = f'wgrib2 -grid globalone.grib2'
subprocess.run(command_grid_1, shell=True, check=True)

command_two = f'wgrib2 global.grib2 -new_grid_winds earth -new_grid latlon 258:104:1.0 27:52:1 globaltwo.grib2'
subprocess.run(command_two, shell=True, check=True)
#Diplay grid from wgrib2 point of view
command_grid_2 = f'wgrib2 -grid globaltwo.grib2'
subprocess.run(command_grid_2, shell=True, check=True)

command_three = f'wgrib2 global.grib2 -new_grid_winds earth -new_grid latlon 259:104:1.0 27:52:1.0 globalthree.grib2'
subprocess.run(command_three, shell=True, check=True)
#Diplay grid from wgrib2 point of view
command_grid_3 = f'wgrib2 -grid globalthree.grib2'
subprocess.run(command_grid_3, shell=True, check=True)

ds1 = xr.open_dataset(
    'globalone.grib2'  # , chunks={"time": 100, "latitude": 100, "longitude": 100}
)

ds2 = xr.open_dataset(
    'globaltwo.grib2'  # , chunks={"time": 100, "latitude": 100, "longitude": 100}
)
ds3 = xr.open_dataset(
    'globalthree.grib2'  # , chunks={"time": 100, "latitude": 100, "longitude": 100}
)

data1 = ds1.metpy.parse_cf()
data2 = ds2.metpy.parse_cf()
data3 = ds3.metpy.parse_cf()
print(data1.longitude)
print(data2.longitude)
print(data3.longitude)
Output on an Apple M2
$ 1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 257.000000 to 0.000000 by 1.000000 #points=5408
1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 258.000000 to 1.000000 by 1.000000 #points=5408
1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 259.000000 to 2.000000 by 1.000000 #points=5408
test.py:40: UserWarning: More than one time coordinate present for variable  "t".
  data1 = ds1.metpy.parse_cf()
test.py:41: UserWarning: More than one time coordinate present for variable  "t".
  data2 = ds2.metpy.parse_cf()
test.py:42: UserWarning: More than one time coordinate present for variable  "t".
  data3 = ds3.metpy.parse_cf()

array([  0., 257., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267.,
       268., 269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279.,
       280., 281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291.,
       292., 293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303.,
       304., 305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315.,
       316., 317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327.,
       328., 329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339.,
       340., 341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351.,
       352., 353., 354., 355., 356., 357., 358., 359.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 0.0 257.0 258.0 ... 357.0 358.0 359.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude

array([  1., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268.,
       269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280.,
       281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292.,
       293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304.,
       305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316.,
       317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328.,
       329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340.,
       341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352.,
       353., 354., 355., 356., 357., 358., 359., 360.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 1.0 258.0 259.0 ... 358.0 359.0 360.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude

array([-101., -100.,  -99.,  -98.,  -97.,  -96.,  -95.,  -94.,  -93.,  -92.,
        -91.,  -90.,  -89.,  -88.,  -87.,  -86.,  -85.,  -84.,  -83.,  -82.,
        -81.,  -80.,  -79.,  -78.,  -77.,  -76.,  -75.,  -74.,  -73.,  -72.,
        -71.,  -70.,  -69.,  -68.,  -67.,  -66.,  -65.,  -64.,  -63.,  -62.,
        -61.,  -60.,  -59.,  -58.,  -57.,  -56.,  -55.,  -54.,  -53.,  -52.,
        -51.,  -50.,  -49.,  -48.,  -47.,  -46.,  -45.,  -44.,  -43.,  -42.,
        -41.,  -40.,  -39.,  -38.,  -37.,  -36.,  -35.,  -34.,  -33.,  -32.,
        -31.,  -30.,  -29.,  -28.,  -27.,  -26.,  -25.,  -24.,  -23.,  -22.,
        -21.,  -20.,  -19.,  -18.,  -17.,  -16.,  -15.,  -14.,  -13.,  -12.,
        -11.,  -10.,   -9.,   -8.,   -7.,   -6.,   -5.,   -4.,   -3.,   -2.,
         -1.,    0.,    1.,    2.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 -101.0 -100.0 -99.0 -98.0 ... 0.0 1.0 2.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude
Output on an x86_64
$ 
1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 257.000000 to 0.000000 by 1.000000 #points=5408
1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 258.000000 to 1.000000 by 1.000000 #points=5408
1:0:d=1998030603:TMP:1000 mb:-28587-6477 hour ave fcst:
1:0:grid_template=0:winds(N/S):
    lat-lon grid:(104 x 52) units 1e-06 input WE:SN output WE:SN res 48
    lat 27.000000 to 78.000000 by 1.000000
    lon 259.000000 to 2.000000 by 1.000000 #points=5408
python3.11/site-packages/gribapi/__init__.py:23: UserWarning: ecCodes 2.31.0 or higher is recommended. You are running version 2.16.0
  warnings.warn(
metpy_plots_pi/test.py:40: UserWarning: More than one time coordinate present for variable  "t".
  data1 = ds1.metpy.parse_cf()
metpy_plots_pi/test.py:41: UserWarning: More than one time coordinate present for variable  "t".
  data2 = ds2.metpy.parse_cf()
metpy_plots_pi/test.py:42: UserWarning: More than one time coordinate present for variable  "t".
  data3 = ds3.metpy.parse_cf()

array([257., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268.,
       269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280.,
       281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292.,
       293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304.,
       305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316.,
       317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328.,
       329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340.,
       341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352.,
       353., 354., 355., 356., 357., 358., 359., 360.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 257.0 258.0 259.0 ... 358.0 359.0 360.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude

array([258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268., 269.,
       270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280., 281.,
       282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292., 293.,
       294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304., 305.,
       306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316., 317.,
       318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328., 329.,
       330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340., 341.,
       342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352., 353.,
       354., 355., 356., 357., 358., 359., 360., 361.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 258.0 259.0 260.0 ... 359.0 360.0 361.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude

array([-101., -100.,  -99.,  -98.,  -97.,  -96.,  -95.,  -94.,  -93.,  -92.,
        -91.,  -90.,  -89.,  -88.,  -87.,  -86.,  -85.,  -84.,  -83.,  -82.,
        -81.,  -80.,  -79.,  -78.,  -77.,  -76.,  -75.,  -74.,  -73.,  -72.,
        -71.,  -70.,  -69.,  -68.,  -67.,  -66.,  -65.,  -64.,  -63.,  -62.,
        -61.,  -60.,  -59.,  -58.,  -57.,  -56.,  -55.,  -54.,  -53.,  -52.,
        -51.,  -50.,  -49.,  -48.,  -47.,  -46.,  -45.,  -44.,  -43.,  -42.,
        -41.,  -40.,  -39.,  -38.,  -37.,  -36.,  -35.,  -34.,  -33.,  -32.,
        -31.,  -30.,  -29.,  -28.,  -27.,  -26.,  -25.,  -24.,  -23.,  -22.,
        -21.,  -20.,  -19.,  -18.,  -17.,  -16.,  -15.,  -14.,  -13.,  -12.,
        -11.,  -10.,   -9.,   -8.,   -7.,   -6.,   -5.,   -4.,   -3.,   -2.,
         -1.,    0.,    1.,    2.])
Coordinates:
    time           datetime64[ns] ...
    step           timedelta64[ns] ...
    isobaricInhPa  float64 ...
  * longitude      (longitude) float64 -101.0 -100.0 -99.0 -98.0 ... 0.0 1.0 2.0
    valid_time     datetime64[ns] ...
    metpy_crs      object Projection: latitude_longitude
Attributes:
    units:          degrees_east
    standard_name:  longitude
    long_name:      longitude
    _metpy_axis:    x,longitude

Of the three examples, the third produces the same long array on both machines.

array([-101., -100.,  -99.,  -98.,  -97.,  -96.,  -95.,  -94.,  -93.,  -92.,
        -91.,  -90.,  -89.,  -88.,  -87.,  -86.,  -85.,  -84.,  -83.,  -82.,
        -81.,  -80.,  -79.,  -78.,  -77.,  -76.,  -75.,  -74.,  -73.,  -72.,
        -71.,  -70.,  -69.,  -68.,  -67.,  -66.,  -65.,  -64.,  -63.,  -62.,
        -61.,  -60.,  -59.,  -58.,  -57.,  -56.,  -55.,  -54.,  -53.,  -52.,
        -51.,  -50.,  -49.,  -48.,  -47.,  -46.,  -45.,  -44.,  -43.,  -42.,
        -41.,  -40.,  -39.,  -38.,  -37.,  -36.,  -35.,  -34.,  -33.,  -32.,
        -31.,  -30.,  -29.,  -28.,  -27.,  -26.,  -25.,  -24.,  -23.,  -22.,
        -21.,  -20.,  -19.,  -18.,  -17.,  -16.,  -15.,  -14.,  -13.,  -12.,
        -11.,  -10.,   -9.,   -8.,   -7.,   -6.,   -5.,   -4.,   -3.,   -2.,
         -1.,    0.,    1.,    2.])

First array differs however: M2:

<xarray.DataArray 'longitude' (longitude: 104)>
array([  0., 257., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267.,
       268., 269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279.,
       280., 281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291.,
       292., 293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303.,
       304., 305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315.,
       316., 317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327.,
       328., 329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339.,
       340., 341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351.,
       352., 353., 354., 355., 356., 357., 358., 359.])

x86_64

<xarray.DataArray 'longitude' (longitude: 104)>
array([257., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268.,
       269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280.,
       281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292.,
       293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304.,
       305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316.,
       317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328.,
       329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340.,
       341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352.,
       353., 354., 355., 356., 357., 358., 359., 360.])

second array also differs:

M2

<xarray.DataArray 'longitude' (longitude: 104)>
array([  1., 258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268.,
       269., 270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280.,
       281., 282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292.,
       293., 294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304.,
       305., 306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316.,
       317., 318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328.,
       329., 330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340.,
       341., 342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352.,
       353., 354., 355., 356., 357., 358., 359., 360.])

x86_64

<xarray.DataArray 'longitude' (longitude: 104)>
array([258., 259., 260., 261., 262., 263., 264., 265., 266., 267., 268., 269.,
       270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280., 281.,
       282., 283., 284., 285., 286., 287., 288., 289., 290., 291., 292., 293.,
       294., 295., 296., 297., 298., 299., 300., 301., 302., 303., 304., 305.,
       306., 307., 308., 309., 310., 311., 312., 313., 314., 315., 316., 317.,
       318., 319., 320., 321., 322., 323., 324., 325., 326., 327., 328., 329.,
       330., 331., 332., 333., 334., 335., 336., 337., 338., 339., 340., 341.,
       342., 343., 344., 345., 346., 347., 348., 349., 350., 351., 352., 353.,
       354., 355., 356., 357., 358., 359., 360., 361.])

Which output is expected to be the "correct" one?

This difference results in very strange behaviour on the M2 (and raspberry pi, arm based as well) when trying to animate over the dateline (eg, slowly moving lon center from west to east, incrementing time, to create an animation). All of the image data appears to shift 1 degree to the right at the point the data flips. It seems fine on the x86_64 but not on an arm based machine.

Is there a way to ensure that the results are consistent across architectures? Is there a way to always have metpy parse the data so that lat/lon is -180 to 180, or, always 0 to 360?

I will attach the pipenv graph outputs below:

M2
$ backcall==0.2.0
bokeh==3.3.4
├── contourpy [required: >=1, installed: 1.2.0]
│   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
├── Jinja2 [required: >=2.9, installed: 3.1.3]
│   └── MarkupSafe [required: >=2.0, installed: 2.1.5]
├── numpy [required: >=1.16, installed: 1.26.4]
├── packaging [required: >=16.8, installed: 23.2]
├── pandas [required: >=1.2, installed: 2.2.0]
│   ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
│   ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
│   │   └── six [required: >=1.5, installed: 1.16.0]
│   ├── pytz [required: >=2020.1, installed: 2024.1]
│   └── tzdata [required: >=2022.7, installed: 2023.4]
├── pillow [required: >=7.1.0, installed: 10.2.0]
├── PyYAML [required: >=3.10, installed: 6.0.1]
├── tornado [required: >=5.1, installed: 6.4]
└── xyzservices [required: >=2021.09.1, installed: 2023.10.1]
Bottleneck==1.3.7
└── numpy [required: Any, installed: 1.26.4]
Cartopy==0.22.0
├── matplotlib [required: >=3.4, installed: 3.8.2]
│   ├── contourpy [required: >=1.0.1, installed: 1.2.0]
│   │   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
│   ├── cycler [required: >=0.10, installed: 0.12.1]
│   ├── fonttools [required: >=4.22.0, installed: 4.48.1]
│   ├── kiwisolver [required: >=1.3.1, installed: 1.4.5]
│   ├── numpy [required: >=1.21,<2, installed: 1.26.4]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── pillow [required: >=8, installed: 10.2.0]
│   ├── pyparsing [required: >=2.3.1, installed: 3.1.1]
│   └── python-dateutil [required: >=2.7, installed: 2.8.2]
│       └── six [required: >=1.5, installed: 1.16.0]
├── numpy [required: >=1.21, installed: 1.26.4]
├── packaging [required: >=20, installed: 23.2]
├── pyproj [required: >=3.1.0, installed: 3.6.1]
│   └── certifi [required: Any, installed: 2024.2.2]
├── pyshp [required: >=2.1, installed: 2.3.1]
└── shapely [required: >=1.7, installed: 2.0.2]
    └── numpy [required: >=1.14, installed: 1.26.4]
cfgrib==0.9.10.4
├── attrs [required: >=19.2, installed: 23.2.0]
├── click [required: Any, installed: 8.1.7]
├── eccodes [required: >=0.9.8, installed: 1.6.1]
│   ├── attrs [required: Any, installed: 23.2.0]
│   ├── cffi [required: Any, installed: 1.16.0]
│   │   └── pycparser [required: Any, installed: 2.21]
│   ├── findlibs [required: Any, installed: 0.0.5]
│   └── numpy [required: Any, installed: 1.26.4]
└── numpy [required: Any, installed: 1.26.4]
colour==0.1.5
distributed==2024.2.0
├── click [required: >=8.0, installed: 8.1.7]
├── cloudpickle [required: >=1.5.0, installed: 3.0.0]
├── dask [required: ==2024.2.0, installed: 2024.2.0]
│   ├── click [required: >=8.1, installed: 8.1.7]
│   ├── cloudpickle [required: >=1.5.0, installed: 3.0.0]
│   ├── fsspec [required: >=2021.09.0, installed: 2024.2.0]
│   ├── importlib-metadata [required: >=4.13.0, installed: 7.0.1]
│   │   └── zipp [required: >=0.5, installed: 3.17.0]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── partd [required: >=1.2.0, installed: 1.4.1]
│   │   ├── locket [required: Any, installed: 1.0.0]
│   │   └── toolz [required: Any, installed: 0.12.1]
│   ├── pyyaml [required: >=5.3.1, installed: 6.0.1]
│   └── toolz [required: >=0.10.0, installed: 0.12.1]
├── jinja2 [required: >=2.10.3, installed: 3.1.3]
│   └── MarkupSafe [required: >=2.0, installed: 2.1.5]
├── locket [required: >=1.0.0, installed: 1.0.0]
├── msgpack [required: >=1.0.0, installed: 1.0.7]
├── packaging [required: >=20.0, installed: 23.2]
├── psutil [required: >=5.7.2, installed: 5.9.8]
├── pyyaml [required: >=5.3.1, installed: 6.0.1]
├── sortedcontainers [required: >=2.0.5, installed: 2.4.0]
├── tblib [required: >=1.6.0, installed: 3.0.0]
├── toolz [required: >=0.10.0, installed: 0.12.1]
├── tornado [required: >=6.0.4, installed: 6.4]
├── urllib3 [required: >=1.24.3, installed: 2.2.0]
└── zict [required: >=3.0.0, installed: 3.0.0]
flox==0.9.2
├── numpy [required: >=1.22, installed: 1.26.4]
├── numpy-groupies [required: >=0.9.19, installed: 0.10.2]
│   └── numpy [required: Any, installed: 1.26.4]
├── packaging [required: >=21.3, installed: 23.2]
├── pandas [required: >=1.5, installed: 2.2.0]
│   ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
│   ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
│   │   └── six [required: >=1.5, installed: 1.16.0]
│   ├── pytz [required: >=2020.1, installed: 2024.1]
│   └── tzdata [required: >=2022.7, installed: 2023.4]
├── scipy [required: >=1.9, installed: 1.12.0]
│   └── numpy [required: >=1.22.4,<1.29.0, installed: 1.26.4]
└── toolz [required: Any, installed: 0.12.1]
fqdn==1.5.1
h5netcdf==1.3.0
├── h5py [required: Any, installed: 3.10.0]
│   └── numpy [required: >=1.17.3, installed: 1.26.4]
└── packaging [required: Any, installed: 23.2]
imageio==2.33.1
├── numpy [required: Any, installed: 1.26.4]
└── pillow [required: >=8.3.2, installed: 10.2.0]
imageio-ffmpeg==0.4.9
└── setuptools [required: Any, installed: 69.0.3]
ipympl==0.9.3
├── ipython [required: <9, installed: 8.21.0]
│   ├── decorator [required: Any, installed: 5.1.1]
│   ├── jedi [required: >=0.16, installed: 0.19.1]
│   │   └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
│   ├── matplotlib-inline [required: Any, installed: 0.1.6]
│   │   └── traitlets [required: Any, installed: 5.14.1]
│   ├── pexpect [required: >4.3, installed: 4.9.0]
│   │   └── ptyprocess [required: >=0.5, installed: 0.7.0]
│   ├── prompt-toolkit [required: >=3.0.41,<3.1.0, installed: 3.0.43]
│   │   └── wcwidth [required: Any, installed: 0.2.13]
│   ├── pygments [required: >=2.4.0, installed: 2.17.2]
│   ├── stack-data [required: Any, installed: 0.6.3]
│   │   ├── asttokens [required: >=2.1.0, installed: 2.4.1]
│   │   │   └── six [required: >=1.12.0, installed: 1.16.0]
│   │   ├── executing [required: >=1.2.0, installed: 2.0.1]
│   │   └── pure-eval [required: Any, installed: 0.2.2]
│   └── traitlets [required: >=5, installed: 5.14.1]
├── ipython-genutils [required: Any, installed: 0.2.0]
├── ipywidgets [required: >=7.6.0,<9, installed: 8.1.2]
│   ├── comm [required: >=0.1.3, installed: 0.2.1]
│   │   └── traitlets [required: >=4, installed: 5.14.1]
│   ├── ipython [required: >=6.1.0, installed: 8.21.0]
│   │   ├── decorator [required: Any, installed: 5.1.1]
│   │   ├── jedi [required: >=0.16, installed: 0.19.1]
│   │   │   └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
│   │   ├── matplotlib-inline [required: Any, installed: 0.1.6]
│   │   │   └── traitlets [required: Any, installed: 5.14.1]
│   │   ├── pexpect [required: >4.3, installed: 4.9.0]
│   │   │   └── ptyprocess [required: >=0.5, installed: 0.7.0]
│   │   ├── prompt-toolkit [required: >=3.0.41,<3.1.0, installed: 3.0.43]
│   │   │   └── wcwidth [required: Any, installed: 0.2.13]
│   │   ├── pygments [required: >=2.4.0, installed: 2.17.2]
│   │   ├── stack-data [required: Any, installed: 0.6.3]
│   │   │   ├── asttokens [required: >=2.1.0, installed: 2.4.1]
│   │   │   │   └── six [required: >=1.12.0, installed: 1.16.0]
│   │   │   ├── executing [required: >=1.2.0, installed: 2.0.1]
│   │   │   └── pure-eval [required: Any, installed: 0.2.2]
│   │   └── traitlets [required: >=5, installed: 5.14.1]
│   ├── jupyterlab-widgets [required: ~=3.0.10, installed: 3.0.10]
│   ├── traitlets [required: >=4.3.1, installed: 5.14.1]
│   └── widgetsnbextension [required: ~=4.0.10, installed: 4.0.10]
├── matplotlib [required: >=3.4.0,<4, installed: 3.8.2]
│   ├── contourpy [required: >=1.0.1, installed: 1.2.0]
│   │   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
│   ├── cycler [required: >=0.10, installed: 0.12.1]
│   ├── fonttools [required: >=4.22.0, installed: 4.48.1]
│   ├── kiwisolver [required: >=1.3.1, installed: 1.4.5]
│   ├── numpy [required: >=1.21,<2, installed: 1.26.4]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── pillow [required: >=8, installed: 10.2.0]
│   ├── pyparsing [required: >=2.3.1, installed: 3.1.1]
│   └── python-dateutil [required: >=2.7, installed: 2.8.2]
│       └── six [required: >=1.5, installed: 1.16.0]
├── numpy [required: Any, installed: 1.26.4]
├── pillow [required: Any, installed: 10.2.0]
└── traitlets [required: <6, installed: 5.14.1]
isoduration==20.11.0
└── arrow [required: >=0.15.0, installed: 1.3.0]
    ├── python-dateutil [required: >=2.7.0, installed: 2.8.2]
    │   └── six [required: >=1.5, installed: 1.16.0]
    └── types-python-dateutil [required: >=2.8.10, installed: 2.8.19.20240106]
jsonpointer==2.4
lz4==4.3.3
MetPy==1.6.0
├── matplotlib [required: >=3.5.0, installed: 3.8.2]
│   ├── contourpy [required: >=1.0.1, installed: 1.2.0]
│   │   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
│   ├── cycler [required: >=0.10, installed: 0.12.1]
│   ├── fonttools [required: >=4.22.0, installed: 4.48.1]
│   ├── kiwisolver [required: >=1.3.1, installed: 1.4.5]
│   ├── numpy [required: >=1.21,<2, installed: 1.26.4]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── pillow [required: >=8, installed: 10.2.0]
│   ├── pyparsing [required: >=2.3.1, installed: 3.1.1]
│   └── python-dateutil [required: >=2.7, installed: 2.8.2]
│       └── six [required: >=1.5, installed: 1.16.0]
├── numpy [required: >=1.20.0, installed: 1.26.4]
├── pandas [required: >=1.4.0, installed: 2.2.0]
│   ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
│   ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
│   │   └── six [required: >=1.5, installed: 1.16.0]
│   ├── pytz [required: >=2020.1, installed: 2024.1]
│   └── tzdata [required: >=2022.7, installed: 2023.4]
├── pint [required: >=0.17, installed: 0.23]
│   └── typing-extensions [required: Any, installed: 4.9.0]
├── pooch [required: >=1.2.0, installed: 1.8.0]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── platformdirs [required: >=2.5.0, installed: 4.2.0]
│   └── requests [required: >=2.19.0, installed: 2.31.0]
│       ├── certifi [required: >=2017.4.17, installed: 2024.2.2]
│       ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
│       ├── idna [required: >=2.5,<4, installed: 3.6]
│       └── urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
├── pyproj [required: >=3.0.0, installed: 3.6.1]
│   └── certifi [required: Any, installed: 2024.2.2]
├── scipy [required: >=1.8.0, installed: 1.12.0]
│   └── numpy [required: >=1.22.4,<1.29.0, installed: 1.26.4]
├── traitlets [required: >=5.0.5, installed: 5.14.1]
└── xarray [required: >=0.21.0, installed: 2024.1.1]
    ├── numpy [required: >=1.23, installed: 1.26.4]
    ├── packaging [required: >=22, installed: 23.2]
    └── pandas [required: >=1.5, installed: 2.2.0]
        ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
        ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
        │   └── six [required: >=1.5, installed: 1.16.0]
        ├── pytz [required: >=2020.1, installed: 2024.1]
        └── tzdata [required: >=2022.7, installed: 2023.4]
nc-time-axis==1.4.1
├── cftime [required: >=1.5, installed: 1.6.3]
│   └── numpy [required: >1.13.3, installed: 1.26.4]
├── matplotlib [required: Any, installed: 3.8.2]
│   ├── contourpy [required: >=1.0.1, installed: 1.2.0]
│   │   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
│   ├── cycler [required: >=0.10, installed: 0.12.1]
│   ├── fonttools [required: >=4.22.0, installed: 4.48.1]
│   ├── kiwisolver [required: >=1.3.1, installed: 1.4.5]
│   ├── numpy [required: >=1.21,<2, installed: 1.26.4]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── pillow [required: >=8, installed: 10.2.0]
│   ├── pyparsing [required: >=2.3.1, installed: 3.1.1]
│   └── python-dateutil [required: >=2.7, installed: 2.8.2]
│       └── six [required: >=1.5, installed: 1.16.0]
└── numpy [required: Any, installed: 1.26.4]
netCDF4==1.6.5
├── certifi [required: Any, installed: 2024.2.2]
├── cftime [required: Any, installed: 1.6.3]
│   └── numpy [required: >1.13.3, installed: 1.26.4]
└── numpy [required: Any, installed: 1.26.4]
numbagg==0.8.0
├── numba [required: Any, installed: 0.59.0]
│   ├── llvmlite [required: >=0.42.0dev0,<0.43, installed: 0.42.0]
│   └── numpy [required: >=1.22,<1.27, installed: 1.26.4]
└── numpy [required: Any, installed: 1.26.4]
opt-einsum==3.3.0
└── numpy [required: >=1.7, installed: 1.26.4]
pickleshare==0.7.5
pillar-youtube-upload==0.3.0
├── google-api-core [required: >=1.23.0, installed: 2.17.0]
│   ├── google-auth [required: >=2.14.1,<3.0.dev0, installed: 2.27.0]
│   │   ├── cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
│   │   ├── pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
│   │   │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
│   │   └── rsa [required: >=3.1.4,<5, installed: 4.9]
│   │       └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
│   ├── googleapis-common-protos [required: >=1.56.2,<2.0.dev0, installed: 1.62.0]
│   │   └── protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.2]
│   ├── protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=4.21.0,!=3.20.1,!=3.20.0, installed: 4.25.2]
│   └── requests [required: >=2.18.0,<3.0.0.dev0, installed: 2.31.0]
│       ├── certifi [required: >=2017.4.17, installed: 2024.2.2]
│       ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
│       ├── idna [required: >=2.5,<4, installed: 3.6]
│       └── urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
├── google-api-python-client [required: >=1.12.5, installed: 2.117.0]
│   ├── google-api-core [required: >=1.31.5,<3.0.0.dev0,!=2.3.0,!=2.2.*,!=2.1.*,!=2.0.*, installed: 2.17.0]
│   │   ├── google-auth [required: >=2.14.1,<3.0.dev0, installed: 2.27.0]
│   │   │   ├── cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
│   │   │   ├── pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
│   │   │   │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
│   │   │   └── rsa [required: >=3.1.4,<5, installed: 4.9]
│   │   │       └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
│   │   ├── googleapis-common-protos [required: >=1.56.2,<2.0.dev0, installed: 1.62.0]
│   │   │   └── protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.2]
│   │   ├── protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=4.21.0,!=3.20.1,!=3.20.0, installed: 4.25.2]
│   │   └── requests [required: >=2.18.0,<3.0.0.dev0, installed: 2.31.0]
│   │       ├── certifi [required: >=2017.4.17, installed: 2024.2.2]
│   │       ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
│   │       ├── idna [required: >=2.5,<4, installed: 3.6]
│   │       └── urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
│   ├── google-auth [required: >=1.19.0,<3.0.0.dev0, installed: 2.27.0]
│   │   ├── cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
│   │   ├── pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
│   │   │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
│   │   └── rsa [required: >=3.1.4,<5, installed: 4.9]
│   │       └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
│   ├── google-auth-httplib2 [required: >=0.1.0, installed: 0.2.0]
│   │   ├── google-auth [required: Any, installed: 2.27.0]
│   │   │   ├── cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
│   │   │   ├── pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
│   │   │   │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
│   │   │   └── rsa [required: >=3.1.4,<5, installed: 4.9]
│   │   │       └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
│   │   └── httplib2 [required: >=0.19.0, installed: 0.22.0]
│   │       └── pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
│   ├── httplib2 [required: >=0.15.0,<1.dev0, installed: 0.22.0]
│   │   └── pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
│   └── uritemplate [required: >=3.0.1,<5, installed: 4.1.1]
├── google-auth [required: >=1.22.1, installed: 2.27.0]
│   ├── cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
│   ├── pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
│   │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
│   └── rsa [required: >=3.1.4,<5, installed: 4.9]
│       └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
├── httplib2 [required: >=0.18.1, installed: 0.22.0]
│   └── pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
└── oauth2client [required: >=4.1.3, installed: 4.1.3]
    ├── httplib2 [required: >=0.9.1, installed: 0.22.0]
    │   └── pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
    ├── pyasn1 [required: >=0.1.7, installed: 0.5.1]
    ├── pyasn1-modules [required: >=0.0.5, installed: 0.3.0]
    │   └── pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
    ├── rsa [required: >=3.1.4, installed: 4.9]
    │   └── pyasn1 [required: >=0.1.3, installed: 0.5.1]
    └── six [required: >=1.6.1, installed: 1.16.0]
pyarrow==15.0.0
└── numpy [required: >=1.16.6,<2, installed: 1.26.4]
pyarrow-hotfix==0.6
seaborn==0.13.2
├── matplotlib [required: >=3.4,!=3.6.1, installed: 3.8.2]
│   ├── contourpy [required: >=1.0.1, installed: 1.2.0]
│   │   └── numpy [required: >=1.20,<2.0, installed: 1.26.4]
│   ├── cycler [required: >=0.10, installed: 0.12.1]
│   ├── fonttools [required: >=4.22.0, installed: 4.48.1]
│   ├── kiwisolver [required: >=1.3.1, installed: 1.4.5]
│   ├── numpy [required: >=1.21,<2, installed: 1.26.4]
│   ├── packaging [required: >=20.0, installed: 23.2]
│   ├── pillow [required: >=8, installed: 10.2.0]
│   ├── pyparsing [required: >=2.3.1, installed: 3.1.1]
│   └── python-dateutil [required: >=2.7, installed: 2.8.2]
│       └── six [required: >=1.5, installed: 1.16.0]
├── numpy [required: >=1.20,!=1.24.0, installed: 1.26.4]
└── pandas [required: >=1.2, installed: 2.2.0]
    ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
    ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
    │   └── six [required: >=1.5, installed: 1.16.0]
    ├── pytz [required: >=2020.1, installed: 2024.1]
    └── tzdata [required: >=2022.7, installed: 2023.4]
siphon==0.9
├── beautifulsoup4 [required: >=4.6, installed: 4.12.3]
│   └── soupsieve [required: >1.2, installed: 2.5]
├── numpy [required: >=1.8, installed: 1.26.4]
├── pandas [required: Any, installed: 2.2.0]
│   ├── numpy [required: >=1.23.2,<2, installed: 1.26.4]
│   ├── python-dateutil [required: >=2.8.2, installed: 2.8.2]
│   │   └── six [required: >=1.5, installed: 1.16.0]
│   ├── pytz [required: >=2020.1, installed: 2024.1]
│   └── tzdata [required: >=2022.7, installed: 2023.4]
├── protobuf [required: >=3.0.0a3, installed: 4.25.2]
└── requests [required: >=1.2, installed: 2.31.0]
    ├── certifi [required: >=2017.4.17, installed: 2024.2.2]
    ├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
    ├── idna [required: >=2.5,<4, installed: 3.6]
    └── urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
uri-template==1.3.0
webcolors==1.13
zarr==2.16.1
├── asciitree [required: Any, installed: 0.3.3]
├── fasteners [required: Any, installed: 0.19]
├── numcodecs [required: >=0.10.0, installed: 0.12.1]
│   └── numpy [required: >=1.7, installed: 1.26.4]
└── numpy [required: >=1.20,!=1.21.0, installed: 1.26.4]
x86_64
$ bokeh==3.3.4
  - contourpy [required: >=1, installed: 1.2.0]
    - numpy [required: >=1.20,<2.0, installed: 1.26.4]
  - Jinja2 [required: >=2.9, installed: 3.1.3]
    - MarkupSafe [required: >=2.0, installed: 2.1.5]
  - numpy [required: >=1.16, installed: 1.26.4]
  - packaging [required: >=16.8, installed: 23.2]
  - pandas [required: >=1.2, installed: 2.2.0]
    - numpy [required: >=1.23.2,<2, installed: 1.26.4]
    - python-dateutil [required: >=2.8.2, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - pytz [required: >=2020.1, installed: 2024.1]
    - tzdata [required: >=2022.7, installed: 2023.4]
  - pillow [required: >=7.1.0, installed: 10.2.0]
  - PyYAML [required: >=3.10, installed: 6.0.1]
  - tornado [required: >=5.1, installed: 6.4]
  - xyzservices [required: >=2021.09.1, installed: 2023.10.1]
Bottleneck==1.3.7
  - numpy [required: Any, installed: 1.26.4]
Cartopy==0.22.0
  - matplotlib [required: >=3.4, installed: 3.8.2]
    - contourpy [required: >=1.0.1, installed: 1.2.0]
      - numpy [required: >=1.20,<2.0, installed: 1.26.4]
    - cycler [required: >=0.10, installed: 0.12.1]
    - fonttools [required: >=4.22.0, installed: 4.48.1]
    - kiwisolver [required: >=1.3.1, installed: 1.4.5]
    - numpy [required: >=1.21,<2, installed: 1.26.4]
    - packaging [required: >=20.0, installed: 23.2]
    - pillow [required: >=8, installed: 10.2.0]
    - pyparsing [required: >=2.3.1, installed: 3.1.1]
    - python-dateutil [required: >=2.7, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
  - numpy [required: >=1.21, installed: 1.26.4]
  - packaging [required: >=20, installed: 23.2]
  - pyproj [required: >=3.1.0, installed: 3.6.1]
    - certifi [required: Any, installed: 2024.2.2]
  - pyshp [required: >=2.1, installed: 2.3.1]
  - shapely [required: >=1.7, installed: 2.0.2]
    - numpy [required: >=1.14, installed: 1.26.4]
cfgrib==0.9.10.4
  - attrs [required: >=19.2, installed: 23.2.0]
  - click [required: Any, installed: 8.1.7]
  - eccodes [required: >=0.9.8, installed: 1.6.1]
    - attrs [required: Any, installed: 23.2.0]
    - cffi [required: Any, installed: 1.16.0]
      - pycparser [required: Any, installed: 2.21]
    - findlibs [required: Any, installed: 0.0.5]
    - numpy [required: Any, installed: 1.26.4]
  - numpy [required: Any, installed: 1.26.4]
colour==0.1.5
distributed==2024.2.0
  - click [required: >=8.0, installed: 8.1.7]
  - cloudpickle [required: >=1.5.0, installed: 3.0.0]
  - dask [required: ==2024.2.0, installed: 2024.2.0]
    - click [required: >=8.1, installed: 8.1.7]
    - cloudpickle [required: >=1.5.0, installed: 3.0.0]
    - fsspec [required: >=2021.09.0, installed: 2024.2.0]
    - importlib-metadata [required: >=4.13.0, installed: 7.0.1]
      - zipp [required: >=0.5, installed: 3.17.0]
    - packaging [required: >=20.0, installed: 23.2]
    - partd [required: >=1.2.0, installed: 1.4.1]
      - locket [required: Any, installed: 1.0.0]
      - toolz [required: Any, installed: 0.12.1]
    - pyyaml [required: >=5.3.1, installed: 6.0.1]
    - toolz [required: >=0.10.0, installed: 0.12.1]
  - jinja2 [required: >=2.10.3, installed: 3.1.3]
    - MarkupSafe [required: >=2.0, installed: 2.1.5]
  - locket [required: >=1.0.0, installed: 1.0.0]
  - msgpack [required: >=1.0.0, installed: 1.0.7]
  - packaging [required: >=20.0, installed: 23.2]
  - psutil [required: >=5.7.2, installed: 5.9.8]
  - pyyaml [required: >=5.3.1, installed: 6.0.1]
  - sortedcontainers [required: >=2.0.5, installed: 2.4.0]
  - tblib [required: >=1.6.0, installed: 3.0.0]
  - toolz [required: >=0.10.0, installed: 0.12.1]
  - tornado [required: >=6.0.4, installed: 6.4]
  - urllib3 [required: >=1.24.3, installed: 2.2.0]
  - zict [required: >=3.0.0, installed: 3.0.0]
flox==0.9.2
  - numpy [required: >=1.22, installed: 1.26.4]
  - numpy-groupies [required: >=0.9.19, installed: 0.10.2]
    - numpy [required: Any, installed: 1.26.4]
  - packaging [required: >=21.3, installed: 23.2]
  - pandas [required: >=1.5, installed: 2.2.0]
    - numpy [required: >=1.23.2,<2, installed: 1.26.4]
    - python-dateutil [required: >=2.8.2, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - pytz [required: >=2020.1, installed: 2024.1]
    - tzdata [required: >=2022.7, installed: 2023.4]
  - scipy [required: >=1.9, installed: 1.12.0]
    - numpy [required: >=1.22.4,<1.29.0, installed: 1.26.4]
  - toolz [required: Any, installed: 0.12.1]
fqdn==1.5.1
h5netcdf==1.3.0
  - h5py [required: Any, installed: 3.10.0]
    - numpy [required: >=1.17.3, installed: 1.26.4]
  - packaging [required: Any, installed: 23.2]
imageio==2.33.1
  - numpy [required: Any, installed: 1.26.4]
  - pillow [required: >=8.3.2, installed: 10.2.0]
imageio-ffmpeg==0.4.9
  - setuptools [required: Any, installed: 69.0.3]
ipympl==0.9.3
  - ipython [required: <9, installed: 8.21.0]
    - decorator [required: Any, installed: 5.1.1]
    - jedi [required: >=0.16, installed: 0.19.1]
      - parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
    - matplotlib-inline [required: Any, installed: 0.1.6]
      - traitlets [required: Any, installed: 5.14.1]
    - pexpect [required: >4.3, installed: 4.9.0]
      - ptyprocess [required: >=0.5, installed: 0.7.0]
    - prompt-toolkit [required: >=3.0.41,<3.1.0, installed: 3.0.43]
      - wcwidth [required: Any, installed: 0.2.13]
    - pygments [required: >=2.4.0, installed: 2.17.2]
    - stack-data [required: Any, installed: 0.6.3]
      - asttokens [required: >=2.1.0, installed: 2.4.1]
        - six [required: >=1.12.0, installed: 1.16.0]
      - executing [required: >=1.2.0, installed: 2.0.1]
      - pure-eval [required: Any, installed: 0.2.2]
    - traitlets [required: >=5, installed: 5.14.1]
  - ipython-genutils [required: Any, installed: 0.2.0]
  - ipywidgets [required: >=7.6.0,<9, installed: 8.1.2]
    - comm [required: >=0.1.3, installed: 0.2.1]
      - traitlets [required: >=4, installed: 5.14.1]
    - ipython [required: >=6.1.0, installed: 8.21.0]
      - decorator [required: Any, installed: 5.1.1]
      - jedi [required: >=0.16, installed: 0.19.1]
        - parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
      - matplotlib-inline [required: Any, installed: 0.1.6]
        - traitlets [required: Any, installed: 5.14.1]
      - pexpect [required: >4.3, installed: 4.9.0]
        - ptyprocess [required: >=0.5, installed: 0.7.0]
      - prompt-toolkit [required: >=3.0.41,<3.1.0, installed: 3.0.43]
        - wcwidth [required: Any, installed: 0.2.13]
      - pygments [required: >=2.4.0, installed: 2.17.2]
      - stack-data [required: Any, installed: 0.6.3]
        - asttokens [required: >=2.1.0, installed: 2.4.1]
          - six [required: >=1.12.0, installed: 1.16.0]
        - executing [required: >=1.2.0, installed: 2.0.1]
        - pure-eval [required: Any, installed: 0.2.2]
      - traitlets [required: >=5, installed: 5.14.1]
    - jupyterlab-widgets [required: ~=3.0.10, installed: 3.0.10]
    - traitlets [required: >=4.3.1, installed: 5.14.1]
    - widgetsnbextension [required: ~=4.0.10, installed: 4.0.10]
  - matplotlib [required: >=3.4.0,<4, installed: 3.8.2]
    - contourpy [required: >=1.0.1, installed: 1.2.0]
      - numpy [required: >=1.20,<2.0, installed: 1.26.4]
    - cycler [required: >=0.10, installed: 0.12.1]
    - fonttools [required: >=4.22.0, installed: 4.48.1]
    - kiwisolver [required: >=1.3.1, installed: 1.4.5]
    - numpy [required: >=1.21,<2, installed: 1.26.4]
    - packaging [required: >=20.0, installed: 23.2]
    - pillow [required: >=8, installed: 10.2.0]
    - pyparsing [required: >=2.3.1, installed: 3.1.1]
    - python-dateutil [required: >=2.7, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
  - numpy [required: Any, installed: 1.26.4]
  - pillow [required: Any, installed: 10.2.0]
  - traitlets [required: <6, installed: 5.14.1]
isoduration==20.11.0
  - arrow [required: >=0.15.0, installed: 1.3.0]
    - python-dateutil [required: >=2.7.0, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - types-python-dateutil [required: >=2.8.10, installed: 2.8.19.20240106]
jsonpointer==2.4
lz4==4.3.3
MetPy==1.6.0
  - matplotlib [required: >=3.5.0, installed: 3.8.2]
    - contourpy [required: >=1.0.1, installed: 1.2.0]
      - numpy [required: >=1.20,<2.0, installed: 1.26.4]
    - cycler [required: >=0.10, installed: 0.12.1]
    - fonttools [required: >=4.22.0, installed: 4.48.1]
    - kiwisolver [required: >=1.3.1, installed: 1.4.5]
    - numpy [required: >=1.21,<2, installed: 1.26.4]
    - packaging [required: >=20.0, installed: 23.2]
    - pillow [required: >=8, installed: 10.2.0]
    - pyparsing [required: >=2.3.1, installed: 3.1.1]
    - python-dateutil [required: >=2.7, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
  - numpy [required: >=1.20.0, installed: 1.26.4]
  - pandas [required: >=1.4.0, installed: 2.2.0]
    - numpy [required: >=1.23.2,<2, installed: 1.26.4]
    - python-dateutil [required: >=2.8.2, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - pytz [required: >=2020.1, installed: 2024.1]
    - tzdata [required: >=2022.7, installed: 2023.4]
  - pint [required: >=0.17, installed: 0.23]
    - typing-extensions [required: Any, installed: 4.9.0]
  - pooch [required: >=1.2.0, installed: 1.8.0]
    - packaging [required: >=20.0, installed: 23.2]
    - platformdirs [required: >=2.5.0, installed: 4.2.0]
    - requests [required: >=2.19.0, installed: 2.31.0]
      - certifi [required: >=2017.4.17, installed: 2024.2.2]
      - charset-normalizer [required: >=2,<4, installed: 3.3.2]
      - idna [required: >=2.5,<4, installed: 3.6]
      - urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
  - pyproj [required: >=3.0.0, installed: 3.6.1]
    - certifi [required: Any, installed: 2024.2.2]
  - scipy [required: >=1.8.0, installed: 1.12.0]
    - numpy [required: >=1.22.4,<1.29.0, installed: 1.26.4]
  - traitlets [required: >=5.0.5, installed: 5.14.1]
  - xarray [required: >=0.21.0, installed: 2024.1.1]
    - numpy [required: >=1.23, installed: 1.26.4]
    - packaging [required: >=22, installed: 23.2]
    - pandas [required: >=1.5, installed: 2.2.0]
      - numpy [required: >=1.23.2,<2, installed: 1.26.4]
      - python-dateutil [required: >=2.8.2, installed: 2.8.2]
        - six [required: >=1.5, installed: 1.16.0]
      - pytz [required: >=2020.1, installed: 2024.1]
      - tzdata [required: >=2022.7, installed: 2023.4]
nc-time-axis==1.4.1
  - cftime [required: >=1.5, installed: 1.6.3]
    - numpy [required: >1.13.3, installed: 1.26.4]
  - matplotlib [required: Any, installed: 3.8.2]
    - contourpy [required: >=1.0.1, installed: 1.2.0]
      - numpy [required: >=1.20,<2.0, installed: 1.26.4]
    - cycler [required: >=0.10, installed: 0.12.1]
    - fonttools [required: >=4.22.0, installed: 4.48.1]
    - kiwisolver [required: >=1.3.1, installed: 1.4.5]
    - numpy [required: >=1.21,<2, installed: 1.26.4]
    - packaging [required: >=20.0, installed: 23.2]
    - pillow [required: >=8, installed: 10.2.0]
    - pyparsing [required: >=2.3.1, installed: 3.1.1]
    - python-dateutil [required: >=2.7, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
  - numpy [required: Any, installed: 1.26.4]
netCDF4==1.6.5
  - certifi [required: Any, installed: 2024.2.2]
  - cftime [required: Any, installed: 1.6.3]
    - numpy [required: >1.13.3, installed: 1.26.4]
  - numpy [required: Any, installed: 1.26.4]
numbagg==0.8.0
  - numba [required: Any, installed: 0.59.0]
    - llvmlite [required: >=0.42.0dev0,<0.43, installed: 0.42.0]
    - numpy [required: >=1.22,<1.27, installed: 1.26.4]
  - numpy [required: Any, installed: 1.26.4]
opt-einsum==3.3.0
  - numpy [required: >=1.7, installed: 1.26.4]
pillar-youtube-upload==0.3.0
  - google-api-core [required: >=1.23.0, installed: 2.17.0]
    - google-auth [required: >=2.14.1,<3.0.dev0, installed: 2.27.0]
      - cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
      - pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
        - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
      - rsa [required: >=3.1.4,<5, installed: 4.9]
        - pyasn1 [required: >=0.1.3, installed: 0.5.1]
    - googleapis-common-protos [required: >=1.56.2,<2.0.dev0, installed: 1.62.0]
      - protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.2]
    - protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=4.21.0,!=3.20.1,!=3.20.0, installed: 4.25.2]
    - requests [required: >=2.18.0,<3.0.0.dev0, installed: 2.31.0]
      - certifi [required: >=2017.4.17, installed: 2024.2.2]
      - charset-normalizer [required: >=2,<4, installed: 3.3.2]
      - idna [required: >=2.5,<4, installed: 3.6]
      - urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
  - google-api-python-client [required: >=1.12.5, installed: 2.117.0]
    - google-api-core [required: >=1.31.5,<3.0.0.dev0,!=2.3.0,!=2.2.*,!=2.1.*,!=2.0.*, installed: 2.17.0]
      - google-auth [required: >=2.14.1,<3.0.dev0, installed: 2.27.0]
        - cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
        - pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
          - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
        - rsa [required: >=3.1.4,<5, installed: 4.9]
          - pyasn1 [required: >=0.1.3, installed: 0.5.1]
      - googleapis-common-protos [required: >=1.56.2,<2.0.dev0, installed: 1.62.0]
        - protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=3.20.1,!=3.20.0, installed: 4.25.2]
      - protobuf [required: >=3.19.5,<5.0.0.dev0,!=4.21.5,!=4.21.4,!=4.21.3,!=4.21.2,!=4.21.1,!=4.21.0,!=3.20.1,!=3.20.0, installed: 4.25.2]
      - requests [required: >=2.18.0,<3.0.0.dev0, installed: 2.31.0]
        - certifi [required: >=2017.4.17, installed: 2024.2.2]
        - charset-normalizer [required: >=2,<4, installed: 3.3.2]
        - idna [required: >=2.5,<4, installed: 3.6]
        - urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
    - google-auth [required: >=1.19.0,<3.0.0.dev0, installed: 2.27.0]
      - cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
      - pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
        - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
      - rsa [required: >=3.1.4,<5, installed: 4.9]
        - pyasn1 [required: >=0.1.3, installed: 0.5.1]
    - google-auth-httplib2 [required: >=0.1.0, installed: 0.2.0]
      - google-auth [required: Any, installed: 2.27.0]
        - cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
        - pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
          - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
        - rsa [required: >=3.1.4,<5, installed: 4.9]
          - pyasn1 [required: >=0.1.3, installed: 0.5.1]
      - httplib2 [required: >=0.19.0, installed: 0.22.0]
        - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
    - httplib2 [required: >=0.15.0,<1.dev0, installed: 0.22.0]
      - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
    - uritemplate [required: >=3.0.1,<5, installed: 4.1.1]
  - google-auth [required: >=1.22.1, installed: 2.27.0]
    - cachetools [required: >=2.0.0,<6.0, installed: 5.3.2]
    - pyasn1-modules [required: >=0.2.1, installed: 0.3.0]
      - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
    - rsa [required: >=3.1.4,<5, installed: 4.9]
      - pyasn1 [required: >=0.1.3, installed: 0.5.1]
  - httplib2 [required: >=0.18.1, installed: 0.22.0]
    - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
  - oauth2client [required: >=4.1.3, installed: 4.1.3]
    - httplib2 [required: >=0.9.1, installed: 0.22.0]
      - pyparsing [required: >=2.4.2,<4,!=3.0.3,!=3.0.2,!=3.0.1,!=3.0.0, installed: 3.1.1]
    - pyasn1 [required: >=0.1.7, installed: 0.5.1]
    - pyasn1-modules [required: >=0.0.5, installed: 0.3.0]
      - pyasn1 [required: >=0.4.6,<0.6.0, installed: 0.5.1]
    - rsa [required: >=3.1.4, installed: 4.9]
      - pyasn1 [required: >=0.1.3, installed: 0.5.1]
    - six [required: >=1.6.1, installed: 1.16.0]
pyarrow==15.0.0
  - numpy [required: >=1.16.6,<2, installed: 1.26.4]
pyarrow-hotfix==0.6
seaborn==0.13.2
  - matplotlib [required: >=3.4,!=3.6.1, installed: 3.8.2]
    - contourpy [required: >=1.0.1, installed: 1.2.0]
      - numpy [required: >=1.20,<2.0, installed: 1.26.4]
    - cycler [required: >=0.10, installed: 0.12.1]
    - fonttools [required: >=4.22.0, installed: 4.48.1]
    - kiwisolver [required: >=1.3.1, installed: 1.4.5]
    - numpy [required: >=1.21,<2, installed: 1.26.4]
    - packaging [required: >=20.0, installed: 23.2]
    - pillow [required: >=8, installed: 10.2.0]
    - pyparsing [required: >=2.3.1, installed: 3.1.1]
    - python-dateutil [required: >=2.7, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
  - numpy [required: >=1.20,!=1.24.0, installed: 1.26.4]
  - pandas [required: >=1.2, installed: 2.2.0]
    - numpy [required: >=1.23.2,<2, installed: 1.26.4]
    - python-dateutil [required: >=2.8.2, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - pytz [required: >=2020.1, installed: 2024.1]
    - tzdata [required: >=2022.7, installed: 2023.4]
siphon==0.9
  - beautifulsoup4 [required: >=4.6, installed: 4.12.3]
    - soupsieve [required: >1.2, installed: 2.5]
  - numpy [required: >=1.8, installed: 1.26.4]
  - pandas [required: Any, installed: 2.2.0]
    - numpy [required: >=1.23.2,<2, installed: 1.26.4]
    - python-dateutil [required: >=2.8.2, installed: 2.8.2]
      - six [required: >=1.5, installed: 1.16.0]
    - pytz [required: >=2020.1, installed: 2024.1]
    - tzdata [required: >=2022.7, installed: 2023.4]
  - protobuf [required: >=3.0.0a3, installed: 4.25.2]
  - requests [required: >=1.2, installed: 2.31.0]
    - certifi [required: >=2017.4.17, installed: 2024.2.2]
    - charset-normalizer [required: >=2,<4, installed: 3.3.2]
    - idna [required: >=2.5,<4, installed: 3.6]
    - urllib3 [required: >=1.21.1,<3, installed: 2.2.0]
uri-template==1.3.0
webcolors==1.13
zarr==2.16.1
  - asciitree [required: Any, installed: 0.3.3]
  - fasteners [required: Any, installed: 0.19]
  - numcodecs [required: >=0.10.0, installed: 0.12.1]
    - numpy [required: >=1.7, installed: 1.26.4]
  - numpy [required: >=1.20,!=1.21.0, installed: 1.26.4]

Thanks in advance for any help!

Operating System

Windows

Version

1.6

Python Version

3.11

Code to Reproduce

See above.

Errors, Traceback, and Logs

No response

stackjohn commented 8 months ago

After a little more investigation it seems like this might be an issue with cfgrib.

Converting the files to NetCDF files with -netcdf seems to resolve it.

I'd be interested if anyone has any thoughts as to why this happens but feel free to close.