读取netcdf4变量属性并将其写入新文件的变量

时间:2019-07-24 01:46:40

标签: python dictionary for-loop netcdf4

我有一个netcdf4文件 input.nc4 ,其中包含变量 alpha beta gamma 。我想创建一个新的netcdf4文件 output.nc4 ,其变量名称为 alpha_new beta_new gamma_new alpha_new beta_new gamma_new 的属性应为 alpha beta gamma 分别(循环),数据只是一个numpy数组。我正在尝试以下操作,但不知道我在做什么错,或者这样做是否正确?

import sys
import numpy   as     np
from   netCDF4 import Dataset

input  = Dataset('input.nc4',  'r')
output = Dataset('output.nc4', 'w', format='NETCDF4')

dict1  = {}
for name, variable in input.variables.items():
    dict1[name] = variable

this   = sys.modules[__name__]

for var_name,var_data in dict1.items():
    file.createDimension(var_name,30)
    var_output = output.createVariable('/Group_1/{}'.format(var_name), float, ('{}'.format(var_name),))
    var_nc[:]  = np.linspace(1,30,30)
    setattr(this, '{}_new'.format(var_name) , var_nc[:])

    for attr_name in var_data.ncattrs():
        setattr(this,'vv{}.{}'.format(var_name,attr_name), getattr(var_data,attr_name))

output.close()

其中attr_name是单位注释最低有效位数,并且对于三个变量而言是不同的。但是上述方法不起作用,尽管该文件是用数据创建的,但属性没有被复制,因此不存在。

1 个答案:

答案 0 :(得分:0)

据我所知,setattr仅设置现有的netCDF4属性,它创建的任何属性都将附加到python实例(不在数据集/文件内部)。相反,您需要创建一个新属性。如果没有直接创建属性的方法,则可以使用一种变通方法,通过直接设置属性然后重命名来创建任意命名的属性。

def set_or_create_attr(var, attr_name, attr_value):
    if attr_name in var.ncattrs(): 
        var.setncattr(attr_name, attr_value)
        return
    var.UnusedNameAttribute = attr_value
    var.renameAttribute("UnusedNameAttribute", attr_name)
    return

使用该函数代替setattr应该可以解决问题,var参数是属性应该附加到的数据集或变量。