xarray.dataset grib数据读取

在ecmwf下的气象数据然后利用xarray和cfgrib进行读取,先开始一直报错

data_ow_1 = xr.open_dataset(file_ocean_wave_1, engine=('cfgrib'))

skipping variable: paramId==140235 shortName='mdww'
Traceback (most recent call last):
  File "D:\anaconda\envs\program1\lib\site-packages\cfgrib\dataset.py", line 676, in build_dataset_components
    dict_merge(variables, coord_vars)
  File "D:\anaconda\envs\program1\lib\site-packages\cfgrib\dataset.py", line 607, in dict_merge
    raise DatasetBuildError(
cfgrib.dataset.DatasetBuildError: key present and new value is different: key='latitude' value=Variable(dimensions=('latitude',), data=array([60.  , 59.7

然后在网上找了好久,按坐标层次读取

data_ow_1 = xr.open_dataset(file_ocean_wave_1, engine=('cfgrib'),backend_kwargs={'filter_by_keys':{'typeOfLevel': 'meanSea'}})
Dataset>
Dimensions:     (time: 744, latitude: 121, longitude: 720)
Coordinates:
    number      int32 ...
  * time        (time) datetime64[ns] 2019-05-01 ... 2019-05-31T23:00:00
    step        timedelta64[ns] ...
    meanSea     float64 ...
  * latitude    (latitude) float64 60.0 59.5 59.0 58.5 58.0 ... 1.5 1.0 0.5 0.0
  * longitude   (longitude) float64 -180.0 -179.5 -179.0 ... 178.5 179.0 179.5
    valid_time  (time) datetime64[ns] ...
Data variables:
    mdww        (time, latitude, longitude) float32 ...
    mpww        (time, latitude, longitude) float32 ...
    mwd         (time, latitude, longitude) float32 ...
    mwp         (time, latitude, longitude) float32 ...
    swh         (time, latitude, longitude) float32 ...
    shww        (time, latitude, longitude) float32 ...
Attributes:
    GRIB_edition:            1
    GRIB_centre:             ecmf
    GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             European Centre for Medium-Range Weather Forecasts
    history:                 2023-04-19T18:07 GRIB to CDM+CF via cfgrib-0.9.1...

我尝试着将读取的文件转为dataframe

new_data_clean_1 = pd.DataFrame([])
for i in data_h_index:
    if select_time[i].split('-')[0] == '2019':
        data_clean_1 = data_ow_1.sel(time=select_time[i], longitude=select_lon[i], latitude=select_lat[i],method='nearest')
       
        DT_1 = data_clean_1.to_pandas()
        print(DT_1)
outu10    0.345963
v10    0.389984
dtype: float64
u10   -0.416733
v10   -0.414703
dtype: float64
u10   -0.416733
v10   -0.414703
dtype: float64

这里u10 和v10被当作数据了
怎么才能将xarray.dataset转化为正常的列表,将u10,v10作为索引

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt: 问题: 我在使用xarray和cfgrib读取ecmwf下的气象数据时遇到了问题。我尝试了按坐标层次读取,并将读取的文件转换成了dataframe格式。但我发现u10和v10被当作了数据量而不是索引。请问如何将xarray.dataset转化为正常的列表,并将u10和v10作为索引。请为我提供具体的解决方案,并使用简洁的语言和代码来解释。 解决方案: 首先,您需要理解xarray和cfgrib的使用。xarray是一个Python库,用于处理和分析多维数据,而cfgrib是一个用于GRIB文件处理的Python库。GRIB文件是一种广泛用于表达气象数据的文件格式,通常由气象预报模型输出。在这种情况下,您需要使用cfgrib来读取GRIB文件,然后使用xarray将数据集导入Python。 下面是一些具体的步骤,以帮助您正确读取和索引气象数据: 1. 首先,您需要安装xarray和cfgrib库,您可以使用以下命令在终端中安装它们: ``` pip install xarray[all] pip install cfgrib ``` 2. 接下来,您需要使用cfgrib库来打开GRIB文件。可以使用以下命令打开文件,并将其保存到一个名为“ds”的数据集中: ``` import cfgrib import xarray as xr ds = xr.open_dataset('path/to/grib/file', engine='cfgrib') ``` 3. 现在,您需要选择您感兴趣的变量(如u10和v10),并将其转换为DataFrame格式。您可以使用以下代码来做到这一点: ``` df = ds[['u10', 'v10']].to_dataframe() ``` 4. 现在,您需要将u10和v10列从数据框中移动到索引中。您可以使用以下命令来实现: ``` df = df.reset_index().set_index(['latitude','longitude','time','valid_time', 'step']).sort_index() ``` 5. 现在,您已经成功将u10和v10列作为索引添加到了数据帧中。此时,您可以直接使用DataFrame的loc方法来访问数据。例如,如果您要访问纬度为40、经度为50、时间为2021-01-01 12:00:00的u10数据,您可以使用以下代码: ``` df.loc[(40, 50, '2021-01-01 12:00:00', slice(None), slice(None)), 'u10'] ``` 以上就是如何使用xarray和cfgrib正确读取和索引气象数据的具体步骤。希望这可以帮助您解决您的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

哈喽帅哥,根据你提供的信息,我对你的问题有以下理解和建议:

  1. 你首先使用cfgrib和xarray成功打开了ECMWF的NetCDF数据,获得了xarray.Dataset类型的对象data_ow_1。
  2. 你尝试将data_ow_1转为Pandas的DataFrame,使用data_ow_1.to_pandas()方法。但是,此方法将变量名称(如u10和v10)作为DataFrame的列名,而不是索引。
  3. 你的目的是想得到u10和v10作为DataFrame的行索引,而变量的值作为DataFrame的值。
    针对这个问题,我的建议是:
  4. 不要直接使用data_ow_1.to_pandas(),这会导致变量名被误认为列名的问题。
  5. 应先使用data_ow_1.reset_index()重置索引,然后选择u10和v10作为DataFrame的行 MultiIndex,并将其它变量的值作为DataFrame的值。代码如下:
python
data_vars = data_ow_1.reset_index()[['u10', 'v10', '其他变量名称']] 
data_vars.set_index(['u10', 'v10'], inplace=True)

# data_vars现在为:
   其他变量名称 
u10 v10  
0.345963 0.389984     xxxxx
-0.416733 -0.414703   yyyyy
...        ...        ...

  1. 这样我们就得到了以(u10, v10)为行MultiIndex,其它变量值为DataFrame值的结果data_vars。
  2. 如果后续需要,我们仍然可以使用 .loc 对data_vars进行索引,获取特定(u10, v10)对应的其它变量值。
    我希望以上解释和建议能够帮助你解决将xarray.Dataset转为Pandas DataFrame的问题,获得你想要的结果,祝君好运