Я пытаюсь сделать metpy.plots.SkewT () из данных GFS.

Когда я пытаюсь вычислить Td (от T, rh), уровни давления не совпадают.

Есть ли какой-нибудь умный способ (с xarray?) Нарезать и нарезать кубиками, чтобы они выстроились в линию?

Следующий код отображает температуру на перекосе, но когда metpy.calc.dewpoint_from_relative_humidity раскомментирован, он жалуется: ValueError: операнды не могут быть переданы вместе с фигурами (31,) (34,)

Также приветствуются любые советы по улучшению кода ....

import xarray
xds0 = xarray.open_dataset(f'https://thredds.ucar.edu/thredds/dodsC/'
    'grib/NCEP/GFS/Global_onedeg/Best')

subset0 = {'method' : 'nearest'}
subset0['lon'] = 238. ; subset0['lat'] = 38.

import metpy.plots
xda1 = xds0.metpy.parse_cf('Temperature_isobaric')
import datetime
vtname0 = xda1.metpy.time.name # eg : time1
subset0[vtname0] = datetime.datetime.utcnow()

T = xda1.metpy.sel(**subset0).values * metpy.units.units(xda1.units) #.squeeze()

vname0 = xda1.metpy.vertical.name # isobaric6 = 0..33
p = xda1[vname0].values * metpy.units.units(xda1[vname0].units)

skewt1 = metpy.plots.SkewT()
skewt1.plot(p, T, 'r')

xda1 = xds0.metpy.parse_cf('Relative_humidity_isobaric') # isobaric = 0..30
rh = xda1.metpy.sel(**subset0).values #* metpy.units.units(xda1.units) #.squeeze()
#Td = metpy.calc.dewpoint_from_relative_humidity(T, rh) # ValueError: operands could not be broadcast together with shapes (31,) (34,) 
#skewt1.plot(p, Td, 'g')

import matplotlib.pyplot as plt
plt.show()
1
klueless 26 Фев 2021 в 06:39

1 ответ

Лучший ответ

Этот процесс можно сделать немного чище, если использовать средство доступа XArray MetPy. для упрощения выбора на основе общих параметров, таких как «время» и «вертикаль». Мы также можем получить значения на общих уровнях, сформированные с помощью np.intersect1d:

import datetime
import metpy
import numpy as np
import xarray

xds0 = xarray.open_dataset('https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_onedeg/Best')
temp_da = xds0.metpy.parse_cf('Temperature_isobaric')
rh_da = xds0.metpy.parse_cf('Relative_humidity_isobaric')

# Formulate subset
subset0 = {'method' : 'nearest',
           'lon': 238.,
           'lat': 38.,
           # Can use 'vertical' here if we pass to metpy's version of sel
           # Use the array of values for pressure that are present in both
           'vertical': np.intersect1d(temp_da.metpy.vertical, rh_da.metpy.vertical),
           'time': datetime.datetime.utcnow()}

temp = temp_da.metpy.sel(**subset0)
rh = rh_da.metpy.sel(**subset0)

# Need to rename the coordinate on RH to match that of temperature
rh = rh.rename({rh_da.metpy.vertical.name: temp_da.metpy.vertical.name})

# Get vertical coordinate (pressure) as a unitted array
p = temp.metpy.vertical.metpy.unit_array

# Calculate dewpoint
td = metpy.calc.dewpoint_from_relative_humidity(temp, rh)

# Plot on SkewT
skewt1 = metpy.plots.SkewT()

# For some reason matplotlib doesn't like the temp array with units inside
# a DataArray
skewt1.plot(p, temp.metpy.unit_array, 'r')
skewt1.plot(p, td, 'g')
1
DopplerShift 1 Мар 2021 в 23:22