当前位置: 首页 > 知识库问答 >
问题:

使用Python从多个netcdf文件创建一个4D(模型、时间、经度、纬度)netcdf文件

申查猛
2023-03-14

我正在下载netcdf格式的气候数据。对于每个变量(例如“降水量”),我需要合并9个netcdf,每个都属于一个独特的气候模型。每个netcdf具有相同的大小(time、lat、lon)。如何将9个3D netcdf合并为一个4D netcdf?最后,我想计算每月的累积降水量。这是我的当前代码:

variables = ['pr']         
scenarios = ['historical', 'ssp245']        #options ['historical', 'ssp126', 'ssp245', 'ssp370', 'ssp585']
models = ['UKESM1-0-LL', 'MRI-ESM2-0', 'MIROC6', 'MIROC-ES2L', 'IPSL-CM6A-LR',
         'GFDL-ESM4', 'FGOALS-g3', 'CNRM-ESM2-1', 'CanESM5']


save_folder = processing_fn / 'local_climate_assessment' / f'{variable}' / 'output'
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

netcdfs = []

# Create one netcdf per model by merging annual netcdfs
for variable in variables:
    for scenario in scenarios:
        for model in models:
    

            source = processing_fn / 'local_climate_assessment' / f'{variable}' / f'{scenario}' / f'{model}'
            netcdf_fn = save_folder / f'{variable}_{scenario}_{model}.nc'
            
            if not os.path.exists(netcdf_fn):
        
                gdf_model = xr.open_mfdataset(str(source / '*.nc'), combine = 'nested', concat_dim="time", use_cftime=True)
                # rename_dict = {variable, f'{variable}_{scenario}_{model}'}
                # gdf_model.rename(rename_dict, inplace = True)
                gdf_model.to_netcdf(netcdf_fn)
                print(gdf_model.attrs['cmip6_source_id'])
                netcdfs.append(gdf_model)
                
            else:
                gdf_model = xr.open_mfdataset(netcdf_fn)
                netcdfs.append(gdf_model)

# Create one netcdf per variable by merging models
ds = xr.combine_nested(netcdfs, concat_dim = "time")
print(ds)
Out[33]: 
<xarray.Dataset>
Dimensions:  (time: 246095, lat: 47, lon: 50)
Coordinates:
  * time     (time) object 1981-01-01 12:00:00 ... 2060-12-31 12:00:00
  * lat      (lat) float64 31.62 31.88 32.12 32.38 ... 42.38 42.62 42.88 43.12
  * lon      (lon) float64 234.6 234.9 235.1 235.4 ... 246.1 246.4 246.6 246.9
Data variables:
    pr       (time, lat, lon) float32 dask.array<chunksize=(360, 47, 50), meta=np.ndarray>

上面的代码有效,但我正在创建一个大的3D netcdf,而不是一个仍然包含气候模型名称的4D。以下代码导致以下错误:

a = ds.resample(time = 'M').sum()
ValueError: index must be monotonic for resampling

如何创建一个包含模型名称的4D netcdf,并重新采样以创建月总和值?

共有1个答案

景靖琪
2023-03-14

我绝对建议阅读有关组合数据的xray文档。

combine_nestedconcat_dim参数可以是您要连接数据的维度列表。您似乎是在连接变量、场景和模型,而不是时间。因此,在这里传递时间并提供一维网络CDF列表是在创建一个重复的时间序列,而没有关于连接维度的信息。

相反,显式嵌套数据集:

netcdfs = []
for variable in variables:
    netcdfs.append([])
    for scenario in scenarios:
        netcdfs[-1].append([])
        for model in models:
            ... # prep & read in your data
            netcdfs[-1][-1].append(gdf_model)

# use nested lists of datasets and an ordered list
# of coordinates matching the list of datasets
ds = xr.combine_nested(
    netcdfs,
    concat_dim=[
        pd.Index(variables, name="variable"),
        pd.Index(scenarios, name="sceanrio"),
        pd.Index(models, name="model"),
    ],
)

或者,首先扩展每个数据集的维度,然后使用combine_by_coords进行连接:

netcdfs = []
for variable in variables:
    for scenario in scenarios:
        for model in models:
            ... # prep & read in your data
            # add coordinates
            gdf_model = gdf_model.expand_dims(
                variable=[variable],
                scenario=[scenario],
                model=[model],
            )

            netcdfs.append(gdf_model)

# auto-combine using your new coordinates
ds = xr.combine_by_coords(netcdfs)
 类似资料:
  • 我有一个海洋温度的 NetCDF 文件。它有 1 个变量(“temp”)和 4 个维度(时间、纬度、纬度和深度)。我想只提取每次最大深度的温度,lon和lat,以获得海底温度光栅砖。我愿意使用 R 或在终端中使用气候数据运算符。 NetCDF 文件的属性 提前感谢!

  • 我想用xarray创建一个NetCDF文件,并尝试理解此处有关“创建数据集”的文档。 下面是示例中的代码(将ds保存到NetCDF): 从上面的例子中,我希望得到一个具有三个维度(x,y,时间)的两个变量(温度,降水)的NetCDF。我希望尺寸在 x 方向上为 2,在 y 方向上为 2,在时间方向上为 3。根据@Bart的测试(评论),NetCDF就是这种情况。因此,当在QGIS 3.4(EPSG

  • 我有一个 netCDF 文件,我希望使用 R 中的“ncdf”包从由纬度/经度边界定义的子集(即经纬度/经度定义的框)中提取子集。 下面是我的netCDF文件的摘要。它有两个维度(纬度和经度)和一个变量(10U_GDS4_SFC)。它本质上是一个包含风值的平面/长网格: 纬度变量从 90 到 -90,经度变量从 0 到 360。 我希望使用以下地理角边界提取整个网格的子集: 左下角:纬度:34.5

  • 我有海洋pH、o2等的全球4D NetCDF文件。每个文件有1个变量和4个维度(时间、经度、纬度和深度)。我希望从不包含NA的每个单元格的最底部深度提取数据。我尝试使用带有负超实验室的NCO的nks: 但是,这只为我提供了最深的箱(即-5700米深度箱)的数据,输出了海洋中所有较浅区域的NaN。有没有办法以类似的方式提取数据,但指定我想要每个单元格最深的非 NaN 值? 我能够使用 R、CDO 或

  • 问题内容: 我想使用Python制作netcdf文件的副本。 关于如何读取或写入netcdf文件,有很多很好的示例,但是也许还有一个很好的方法,可以进行变量的输入,然后输出到另一个文件。 一个好的方法很不错,以便以最低的成本获得尺寸和尺寸变量到输出文件。 问题答案: 我在python netcdf上 找到了此问题的答案:制作了所有变量和属性的一个副本,但一个副本,但我需要对其进行更改以使其与我的p

  • 我正在尝试使用臭氧监测仪器(OMI)的数据文件,并将该来源的数据与监测类似数据的地面仪器进行比较。 最终,我想知道它们是否在一个特定的多边形内。然而,要做到这一点,我需要创建我想象的多边形。 我有以下变量 latmat和lonmat当然都比两个指数大得多,但我尽量保持这些简单。这些值分别表示四角卫星像素的纬度和经度点。 最重要的是,我在表格中也有数据 我如何着手创建一个地理数据框架与地理平台,识别