首页 > 解决方案 > 创建新的 netcdf 变量并使用列表中的数据填充它

问题描述

我在文件调用 fortime 中创建一个新变量,我能够创建变量并将数据附加到它这里是代码

cdf_fortime = cdf_file.createVariable('fortime', 'f8', ('Time', 'yt_ocean', 'xt_ocean',),zlib=True, complevel=1)
cdf_fortime.setncatts({'units': 'hours', 'long_name': 'fortime', 'standard_name':'forecast_time_offset'})
cdf_fortime[:] = fcast_hrs

netcdf 文件的尺寸

dimensions:
        Time = 1 ;
        xt_ocean = 3600 ;
        yt_ocean = 1500 ;
        st_ocean = 51 ;
        st_edges_ocean = 52 ;
        nv = 2 ;

现在如果 fcast_hrs 是一个单一的值 42 它附加到 fortime 变量。

现在,如果我有一个具有以下尺寸的 netcdf 文件

dimensions:
        Time = UNLIMITED ; // (8 currently)
        nv = 2 ;
        yt_ocean = 1500 ;
        xt_ocean = 3600 ;
        yu_ocean = 1500 ;
        xu_ocean = 3600 ;

现在我有 fcast_hrs 它将是一个值列表,如 120、123、126、129、132、135、138、141。所以想要循环 fcast_hrs 并将每个值附加到 fortime 变量

我创建了一个 for 循环来遍历 fcast_hrs 列表,然后将其添加到 fortime 值,但这里的问题是它覆盖了以前的值,因此 fortime 变量中的唯一值是 141 重复,而不是中的每个值名单。我认为它可能只是附加到末尾,但事实并非如此。

cdf_fortime = cdf_file.createVariable('fortime', 'f8', ('Time', 'yt_ocean', 'xt_ocean',),zlib=True, complevel=1)
cdf_fortime.setncatts({'units': 'hours', 'long_name': 'fortime', 'standard_name':'forecast_time_offset'})
for hour in fcast_hrs:
        cdf_fortime[:] = fcast_hrs

如何遍历 fcast_hrs 列表并将其附加到 fortime 变量

所以为了进一步扩展这个问题,我有以下蒙面数组

masked_array(data=[24.0, 27.0, 30.0, 33.0, 36.0, 39.0, 42.0, 45.0],
             mask=[False, False, False, False, False, False, False, False],
       fill_value=1e+20)

我创建了一个具有以下详细信息的变量

<class 'netCDF4._netCDF4.Variable'>
float64 fortime(Time, yt_ocean, xt_ocean)
    units: hours
    long_name: fortime
    standard_name: forecast_time_offset
unlimited dimensions:
current shape = (8, 1500, 3600)
filling on, default _FillValue of 9.969209968386869e+36 used

我已经能够通过使用 cdf_fortime[:,0,0] 将掩码数组中的值添加到该变量中,现在该变量看起来像这样

data=[[[24.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[27.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[30.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        ...,

        [[39.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[42.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[45.0, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]]],

但我想用相同的值填充所有值,所以它看起来像这个例子

[[45.0, 45.0, 45.0, ..., 45.0, 45.0, 45.0],
 [45.0, 45.0, 45.0, ..., 45.0, 45.0, 45.0],
 ...,
 [45.0, 45.0, 45.0, ..., 45.0, 45.0, 45.0]]],

我怎样才能做到这一点

标签: pythonnetcdfnetcdf4

解决方案


推荐阅读