KeyError при попытке построить METAR - PullRequest
0 голосов
/ 07 октября 2019

При попытке построить наблюдения поверхности с сервера данных THREDDS мой скрипт зависает или возвращает KeyError. Ниже приведен код:

metarfile = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/'
                       'nws/metar/ncdecoded/files/latest.xml')
latestmetar = metarfile.datasets[0]

file = latestmetar.remote_access(use_xarray=True)

parsed_temp = file.metpy.parse_cf('air_temperature')
parsed_td = file.metpy.parse_cf('dew_point_temperature')
parsed_mslp = file.metpy.parse_cf('air_pressure_at_sea_level')

parsed_temp = parsed_temp * 9/5 + 32
parsed_td = parsed_td * 9/5 + 32

prj = ccrs.LambertConformal(central_latitude=35,
                            central_longitude=-98,
                            standard_parallels=(30, 60))

points = prj.transform_points(ccrs.PlateCarree(), file['longitude'].values,
                                                  file['latitude'].values)

file[mpcalc.reduce_point_density(points, 100000)]

fig = plt.figure(1, figsize=(10,10))
ax = fig.add_subplot(1, 1, 1, projection=prj)

ax.set_extent((-104.1, -95.5, 32.1, 39.1))

ax.add_feature(cfeature.STATES.with_scale('50m'),linewidth=.5,
                                                 edgecolor='black',
                                                 zorder=5)

metarplots = StationPlot(ax, file['longitude'].values, file['latitude'].values,
                             clip_on=True, transform=ccrs.PlateCarree(),
                             fontsize=12)

metarplots.plot_parameter('NW', file['air_temperature'], color='red')
metarplots.plot_parameter('SW', file['dew_point_temperature'], color='green')
metarplots.plot_parameter('NE', file['air_pressure_at_sea_level'],
                                color='yellow')

При хешировании MetPy reduce_point_density для решения проблемы слишком большого количества точек данных код зависает без сообщения об ошибке. Кроме того, при печати данных из parsed_td он возвращает нужные мне значения.

<xarray.DataArray 'dew_point_temperature' (recNum: 15331)>
array([69.8 , 41.  , 32.  , ..., 78.98, 60.8 , 62.96], dtype=float32)
Dimensions without coordinates: recNum

Я действительно не уверен, с чего начать устранение этой проблемы, так как я не делал до построения точечных данных. Любая помощь будет полезна!

РЕДАКТИРОВАТЬ: Включить сообщение об ошибке.

Traceback (most recent call last):
  File "/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py", line 945, in _copy_listed
    variables[name] = self._variables[name]
KeyError: True

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "mslp_vis.py", line 63, in <module>
    file[mpcalc.reduce_point_density(points, 100000)]
  File "/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py", line 1060, in __getitem__
    return self._copy_listed(np.asarray(key))
  File "/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py", line 948, in _copy_listed
    self._variables, name, self._level_coords, self.dims)
  File "/anaconda3/lib/python3.7/site-packages/xarray/core/dataset.py", line 68, in _get_virtual_variable
    raise KeyError(key)
KeyError: True

1 Ответ

0 голосов
/ 07 октября 2019

Проблема здесь в том, как пишется netCDF. Он поставляется в формате дискретной геометрии дискретизации (DSG), который отличается от типичного формата с сеткой. В результате маска, вычисленная здесь, действительна только для переменных Lat и Long. Для переменных данных необходимо вычислить новую маску на основе действительных станций, которые остаются после вычисления начальной маски. Следующий код адаптирует исходный код для демонстрации этого полного процесса. Обратите внимание, что цикл медленный, и, возможно, его можно изменить.

metarfile = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/'
                       'nws/metar/ncdecoded/files/latest.xml')
latestmetar = metarfile.datasets[0]

file = latestmetar.remote_access(use_xarray=True)

parsed_temp = file.metpy.parse_cf('air_temperature')
parsed_td = file.metpy.parse_cf('dew_point_temperature')
parsed_mslp = file.metpy.parse_cf('air_pressure_at_sea_level')

parsed_temp = parsed_temp * 9/5 + 32
parsed_td = parsed_td * 9/5 + 32

prj = ccrs.LambertConformal(central_latitude=35,
                            central_longitude=-98,
                            standard_parallels=(30, 60))

points = prj.transform_points(ccrs.PlateCarree(), file['longitude'].values,
                                                  file['latitude'].values)

points[2477, 0:2] = [0,0]
mask = mpcalc.reduce_point_density(points, 100000)

mask_stations = []
for x in file['parent_index'].values:
    if x in file['station'][mask]:
        mask_stations.append(True)
    else:
        mask_stations.append(False)

fig = plt.figure(1, figsize=(10,10))
ax = fig.add_subplot(1, 1, 1, projection=prj)

ax.set_extent((-104.1, -95.5, 32.1, 39.1))

ax.add_feature(cfeature.STATES.with_scale('50m'),linewidth=.5,
                                                 edgecolor='black',
                                                 zorder=5)

metarplots = StationPlot(ax, file['longitude'].values[mask], file['latitude'].values[mask],
                             clip_on=True, transform=ccrs.PlateCarree(),
                             fontsize=12)

metarplots.plot_parameter('NW', file['air_temperature'][mask_stations].metpy.convert_units('degF'), color='red')
metarplots.plot_parameter('SW', file['dew_point_temperature'][mask_stations], color='green')
metarplots.plot_parameter('NE', file['air_pressure_at_sea_level'][mask_stations],
                                color='blue')
...