【问题标题】:jupyterhub: Opening multiple netCDF files with xarray.open_mfdataset - several errorsjupyterhub:使用 xarray.open_mfdataset 打开多个 netCDF 文件 - 几个错误
【发布时间】:2021-05-11 10:50:39
【问题描述】:

我很想在 xarray 和打开多个 netcdf 文件方面获得您的帮助。我有几个包含 lat、lon、time 作为维度的 .nc 文件。这些文件给出了从 1850-01 到 2100-12 的每月大气温度。每个文件都包含不同气候模型的数据。现在我想组合文件来绘制多模型时间序列并查看多模型均值。只需使用 xr.open_dataset 打开每个文件即可,但 open_mfdataset 不能。 这些是我要打开的文件:

tas_Amon_CNRM-ESM2-1_hist_ssp119_r1i1p1f2_gr_185001-210012.nc

tas_Amon_CanESM5_hist_ssp119_r10i1p1f1_gn_185001-210012.nc

tas_Amon_EC-Earth3-Veg-LR_hist_ssp119_r1i1p1f1_gr_185001-210012.nc

tas_Amon_EC-Earth3_hist_ssp119_r4i1p1f1_gr_185001-210012.nc

tas_Amon_GFDL-ESM4_hist_ssp119_r1i1p1f1_gr1_185001-210012.nc

tas_Amon_GISS-E2-1-G_hist_ssp119_r1i1p1f2_gn_185001-210012.nc

tas_Amon_IPSL-CM6A-LR_hist_ssp119_r1i1p1f1_gr_185001-210012.nc

等等……

我申请了

import xarray as xr

xr.open_mfdataset('path/to/file/*.nc', concat_dim=time)

我的第一个错误是关于具有不同日历的文件(因此时间维度是 datetime64 或对象 - 即格式在某些文件中是日期时间格式,而在其他文件中是字符串格式)。在对该问题进行深入研究并将几个函数和 cmets 添加到 xr.open_mfdataset(preprocess=...、combat_by、concat_dim 等)之后,我无法将时间坐标转换为相同的格式。 然后我发现使用ncks -A -v time file1.nc file2.nc 我可以用文件1 的时间坐标覆盖file2 的时间坐标。将xr.open_mfdatasetconcat_dim='time' 应用于这些新改编的文件会给我一个新错误“每个维度都需要用于推断连接顺序的坐标”。 现在我想知道是否必须将文件放在同一个网格上才能使用 xr.open_mfdataset 打开它们?

我也已经尝试只打开两个具有相同时间坐标 (datetime64) 的文件,它给了我以下错误:ValueError: Could not translate 'tas_Amon_EC-Earth3_hist_ssp119_r4i1p1f1_gr_185001-210012.'作为一个数字

这让我现在非常模糊,几天以来我都没有消除错误并想,你可能知道为什么会发生这些错误,或者曾经有过同样的错误吗?

【问题讨论】:

    标签: python netcdf python-xarray


    【解决方案1】:

    您的目标是合并多个 CMIP6 模型输出并将它们组合成一个整体均值。我不知道如何使用 xarray 来解决这个问题,但这可以使用我的 nctoolkit 包在几行中完成,它使用 CDO 作为后端(阅读关于包 here 的信息)。

    根据您提供的数据,我猜您正在使用或多或少的原始数据,结合了历史数据和 ssp 数据。这意味着网格将不同。因此,您可能需要分几步进行分析。首先重新网格到您选择的公共网格。我刚刚使用了下面合奏中的第一个文件。其次,您要计算整体均值。以下应该没有问题。

    import nctoolkit as nc
    ds = nc.open_data('path/to/file/*.nc')
    ds.regrid(ds[0], method = "nn")
    # Asssuming some of the files have more than one variable, you might need to do this
    ds.select(variable = "tas")
    ds.ensemble_mean()
    ds.plot()
    # if you want to convert from an nctoolkit dataset to an xarray dataset:
    ds_xr = ds.to_xarray()
    

    【讨论】:

    • 这确实是我一开始的想法,但我想找到一个解决方案,而不是将所有数据重新网格化到一个公共网格中。它知道使用字典和 for 循环将所有数据加载到字典中,并在字典中使用 xarray.decode_cf 以保持时间维度一致。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多