#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.