微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将横截面数据保存到netCDF

如何解决如何将横截面数据保存到netCDF

我想将两个坐标之间的横断面数据保存为netCDF文件

我正在遵循Metpy's Cross Section Analysis中描述的示例代码

以下是修改后的代码,其中添加了remove crs命令:

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
import metpy.calc as mpcalc
from metpy.interpolate import cross_section

#use xarray to read the data 
data = xr.open_dataset('/home/rik/hrrr/gtgn/gtgn.t2215z.edr.f000.nc')
print(data)
<xarray.Dataset>
Dimensions:            (alt: 52,time: 1,x: 451,y: 337)
Coordinates:
  * time               (time) datetime64[ns] 2020-06-18T22:15:00
  * x                  (x) float64 0.0 1.355e+04 ... 6.082e+06 6.095e+06
  * y                  (y) float64 0.0 1.355e+04 ... 4.538e+06 4.551e+06
  * alt                (alt) float64 0.0 30.0 304.0 ... 1.494e+04 1.524e+04
Data variables:
    LAmbert_Conformal  int32 ...
    param30.19.0       (time,alt,y,x) float32 ...
Attributes:
    CDI:          climate Data Interface version 1.9.8 (https://mpimet.mpg.de...
    Conventions:  CF-1.6
    history:      Wed Oct 07 17:19:41 2020: cdo -f nc copy gtgn.t2215z.edr.f0...
    institution:  National Center for Atmospheric Research
    CDO:          climate Data Operators version 1.9.8 (https://mpimet.mpg.de...

#parse the data and remove crs from coordinate
data = data.metpy.parse_cf().squeeze()
data.drop_vars('crs')
print(data)
<xarray.Dataset>
Dimensions:            (alt: 52,y: 337)
Coordinates:
    time               datetime64[ns] 2020-06-18T22:15:00
  * x                  (x) float64 0.0 1.355e+04 ... 6.082e+06 6.095e+06
  * y                  (y) float64 0.0 1.355e+04 ... 4.538e+06 4.551e+06
  * alt                (alt) float64 0.0 30.0 304.0 ... 1.494e+04 1.524e+04
    crs                object Projection: lAmbert_conformal_conic
Data variables:
    LAmbert_Conformal  int32 ...
    param30.19.0       (alt,x) float32 ...
Attributes:
    CDI:          climate Data Interface version 1.9.8 (https://mpimet.mpg.de...
    Conventions:  CF-1.6
    history:      Wed Oct 07 17:19:41 2020: cdo -f nc copy gtgn.t2215z.edr.f0...
    institution:  National Center for Atmospheric Research
    CDO:          climate Data Operators version 1.9.8 (https://mpimet.mpg.de...

#define start and end points
start = (37.0,-105.0)
end = (35.5,-90.0)

#get the cross section
cross = cross_section(data,start,end)
print(cross)
<xarray.Dataset>
Dimensions:            (alt: 52,index: 100)
Coordinates:
    time               datetime64[ns] 2020-06-18T22:15:00
    crs                object Projection: lAmbert_conformal_conic
  * alt                (alt) float64 0.0 30.0 304.0 ... 1.494e+04 1.524e+04
    x                  (index) float64 2.424e+06 2.438e+06 ... 3.793e+06
    y                  (index) float64 1.967e+06 1.965e+06 ... 1.772e+06
  * index              (index) int64 0 1 2 3 4 5 6 7 ... 92 93 94 95 96 97 98 99
Data variables:
    LAmbert_Conformal  int32 ...
    param30.19.0       (alt,index) float64 0.3914 0.3687 ... 0.0605 0.0605
Attributes:
    CDI:          climate Data Interface version 1.9.8 (https://mpimet.mpg.de...
    Conventions:  CF-1.6
    history:      Wed Oct 07 17:19:41 2020: cdo -f nc copy gtgn.t2215z.edr.f0...
    institution:  National Center for Atmospheric Research
    CDO:          climate Data Operators version 1.9.8 (https://mpimet.mpg.de...

当我尝试将横截面xarray.dataset写入/保存为netCDF文件时,出现以下错误消息:

cross.to_netcdf('/home/rik/hrrr/gtgn/xarray_cross_section_data_to_netcdf.nc')

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-0b4fce1219bd> in <module>
----> 1 cross.to_netcdf('/home/rik/hrrr/gtgn/xarray_cross_section_data_to_netcdf.nc')

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/core/dataset.py in to_netcdf(self,path,mode,format,group,engine,encoding,unlimited_dims,compute,invalid_netcdf)
   1565             unlimited_dims=unlimited_dims,1566             compute=compute,-> 1567             invalid_netcdf=invalid_netcdf,1568         )
   1569 

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/backends/api.py in to_netcdf(dataset,path_or_file,multifile,invalid_netcdf)
   1080         # to be parallelized with dask
   1081         dump_to_store(
-> 1082             dataset,store,writer,encoding=encoding,unlimited_dims=unlimited_dims
   1083         )
   1084         if autoclose:

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/backends/api.py in dump_to_store(dataset,encoder,unlimited_dims)
   1126         variables,attrs = encoder(variables,attrs)
   1127 
-> 1128     store.store(variables,attrs,check_encoding,unlimited_dims=unlimited_dims)
   1129 
   1130 

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/backends/common.py in store(self,variables,attributes,check_encoding_set,unlimited_dims)
    248             writer = ArrayWriter()
    249 
--> 250         variables,attributes = self.encode(variables,attributes)
    251 
    252         self.set_attributes(attributes)

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/backends/common.py in encode(self,attributes)
    337         # All NetCDF files get CF encoded by default,without this attempting
    338         # to write times,for example,would fail.
--> 339         variables,attributes = cf_encoder(variables,attributes)
    340         variables = {k: self.encode_variable(v) for k,v in variables.items()}
    341         attributes = {k: self.encode_attribute(v) for k,v in attributes.items()}

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/conventions.py in cf_encoder(variables,attributes)
    771     _update_bounds_encoding(variables)
    772 
--> 773     new_vars = {k: encode_cf_variable(v,name=k) for k,v in variables.items()}
    774 
    775     # Remove attrs from bounds variables (issue #2921)

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/conventions.py in <dictcomp>(.0)
    771     _update_bounds_encoding(variables)
    772 
--> 773     new_vars = {k: encode_cf_variable(v,v in variables.items()}
    774 
    775     # Remove attrs from bounds variables (issue #2921)

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/conventions.py in encode_cf_variable(var,needs_copy,name)
    256     var = maybe_default_fill_value(var)
    257     var = maybe_encode_bools(var)
--> 258     var = ensure_dtype_not_object(var,name=name)
    259     return var
    260 

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/conventions.py in ensure_dtype_not_object(var,name)
    214             data[missing] = fill_value
    215         else:
--> 216             data = _copy_with_dtype(data,dtype=_infer_dtype(data,name))
    217 
    218         assert data.dtype.kind != "O" or data.dtype.Metadata

~/miniconda3/envs/metpy/lib/python3.7/site-packages/xarray/conventions.py in _infer_dtype(array,name)
    150     raise ValueError(
    151         "unable to infer dtype on variable {!r}; xarray "
--> 152         "cannot serialize arbitrary Python objects".format(name)
    153     )
    154 

ValueError: unable to infer dtype on variable 'crs'; xarray cannot serialize arbitrary Python objects

我在做什么错了?

解决方法

正如@Robert Wilson在评论中建议的那样,您必须从坐标中删除crs。但是,drop_vars()从数据集中删除变量。如要删除坐标,

cross = cross.reset_coords('crs',drop=True)

Reference

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。