Можно ли использовать metpy.parse_cf() для файлов WRF?

#metpy

Вопрос:

Я пытаюсь следовать примеру построения поперечного сечения MetPy (https://unidata.github.io/MetPy/latest/examples/cross_section.html), но применяя его к выходным данным WRF. Я читаю в файле WRF как набор данных xarray, а затем применяю к нему metpy.parse_cf().squeeze (), как в примере. Однако я получаю этот набор ошибок:

 Traceback (most recent call last):
  File "plot_wrf_cross_overlays.py", line 252, in <module>
    main(init_dt_first, init_dt_last, init_stride_h, plot_beg_lead_time, plot_end_lead_time, plot_stride, domain)
  File "plot_wrf_cross_overlays.py", line 236, in main
    DS_wrf_xr = DS_wrf_xr.metpy.parse_cf().squeeze()
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 521, in parse_cf
    for single_varname in varname])
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 521, in <listcomp>
    for single_varname in varname])
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 537, in parse_cf
    var = self._fixup_coords(var)
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 566, in _fixup_coords
    var = var.metpy.convert_coordinate_units(coord_name, 'meter')
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 159, in convert_coordinate_units
    data=self._data_array[coord].metpy.unit_array.m_as(units)
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/metpy/xarray.py", line 135, in unit_array
    return self._data_array.values * self.units
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/pint/quantity.py", line 1540, in __array_ufunc__
    return numpy_wrap("ufunc", ufunc, inputs, kwargs, types)
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/pint/numpy_func.py", line 894, in numpy_wrap
    return handled[name](*args, **kwargs)
  File "/glade/work/jaredlee/python/my_npl_clone_20200417_cheyenne_3.7.5/lib/python3.7/site-packages/pint/numpy_func.py", line 289, in implementation
    result_magnitude = func(*stripped_args, **stripped_kwargs)
numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' cannot use operands with types dtype('<M8[ns]') and dtype('int64')
 

Я получаю то же самое, даже когда в конце сбрасываю вызов функции squeeze (). Есть какие-нибудь идеи, в чем причина этого или как это исправить? Это стандартный файл wrfout из WRF v4.2. Я знаю, что WRF, к сожалению, не соответствует соглашениям, совместимым с CF, и это, вероятно, является причиной этой проблемы, но, безусловно, это проблема, с которой сталкивались другие, поэтому я надеюсь, что кто-нибудь может помочь мне указать правильное направление здесь, чтобы я все еще мог надеяться использовать MetPy для графиков поперечного сечения WRF.

Ответ №1:

В прямом ответе на ваш вопрос, нет, .metpy.parse_cf() не может использоваться с файлами WRF, так как они не соответствуют стандарту CF в отношении метаданных отображения сетки. Однако для наборов данных без сопоставлений сетки, совместимых с CF, MetPy предоставляет .metpy.assign_crs() метод, который можно использовать вместо этого для регистрации необходимой информации о проекции для выполнения вычислений cross_section . Например, для набора данных WRF в конформно-конической проекции Ламберта вы можете использовать следующее в качестве замены для parse_cf() :

 DS_wrf_xr = DS_wrf_xr.metpy.assign_crs({
    'grid_mapping_name': 'lambert_conformal_conic',
    'earth_radius': 6370000,
    'standard_parallel': [DS_wrf_xr.TRUELAT1, DS_wrf_xr.TRUELAT2],
    'longitude_of_central_meridian': DS_wrf_xr.STAND_LON,
    'latitude_of_projection_origin': DS_wrf_xr.MOAD_CEN_LAT
})
 

Тем не менее, если взглянуть на вашу проблему в целом, характер ошибки, с которой вы столкнулись при попытке использовать .metpy.parse_cf() , является неожиданной ошибкой, и поэтому я бы рекомендовал поднять проблему на трекере проблем MetPy. Кроме того, документация (или вспомогательные процедуры) для использования MetPy с WRF …своеобразна… метаданные, по общему признанию, все еще отсутствуют (см. https://github.com/Unidata/MetPy/issues/1004 и https://github.com/Unidata/MetPy/issues/1089 для соответствующего обсуждения). Например, проблема, с которой вы, вероятно, столкнетесь при работе с поперечными сечениями WRF, заключается в том, что в наборах данных WRF отсутствуют координаты измерений, которые необходимо будет получить с помощью .assign_y_x или пользовательских процедур.

Комментарии:

1. Спасибо за предложения, Джон. Ваш фрагмент кода действительно помог мне обойти .metpy.parse_cf(). Однако, когда я использовал metpy.интерполяция.cross_section() функция, он дал мне ошибку: TypeError: Object of type float32 is not JSON serializable. я не знаю, так что правила этикета как я новичок, так что это должно быть новой должности, или продолжение, а новый ответ ниже, чтобы я мог после полного сообщения об ошибках и фрагменты кода?

2. Основываясь на его правилах, SO не всегда подходит для расширенного обсуждения и устранения неполадок… Я не уверен, что здесь лучший способ обойти это, но если вы не против, я бы рекомендовал опубликовать этот вопрос (вместе с полными сообщениями об ошибках и фрагментами кода) на странице обсуждений MetPy, где могут быть лучшие интерактивные беседы с другими пользователями и разработчиками MetPy.