예제 #1
0
 def dimvalue(self, idx, convert=False):
     '''
     Get dimension values.
     
     :param idx: (*int*) Dimension index.
     :param convert: (*boolean*) If convert to real values (i.e. datetime). Default
         is ``False``.
     
     :returns: (*array_like*) Dimension values
     '''
     dim = self.dims[idx]
     if convert:
         if dim.getDimType() == DimensionType.T:
             return miutil.nums2dates(dim.getDimValue())
         else:
             return NDArray(ArrayUtil.array(self.dims[idx].getDimValue()))
     else:
         return NDArray(ArrayUtil.array(self.dims[idx].getDimValue()))
예제 #2
0
 def dimvalue(self, idx, convert=False):
     '''
     Get dimension values.
     
     :param idx: (*int*) Dimension index.
     :param convert: (*boolean*) If convert to real values (i.e. datetime). Default
         is ``False``.
     
     :returns: (*array_like*) Dimension values
     '''
     dim = self.dims[idx]
     if convert:
         if dim.getDimType() == DimensionType.T:
             return miutil.nums2dates(dim.getDimValue())
         else:
             return MIArray(ArrayUtil.array(self.dims[idx].getDimValue()))
     else:
         return MIArray(ArrayUtil.array(self.dims[idx].getDimValue()))
예제 #3
0
    def nc_define(self, dims, gattrs, vars):
        '''
        Define dimensions, global attributes, variables of the netcdf file
        :param dims: (*list of Dimension*) The dimensions
        :param gattrs: (*list of Attribute*) The global attributes
        :param vars: (*list of DimVariable*) The variables
        '''
        #Add dimensions
        ncdims = []
        for dim in dims:
            ncdims.append(self.adddim(dim.getName(), dim.getLength()))

        #Add global attributes
        if not gattrs is None:
            for key in gattrs:
                self.addgroupattr(key, gattrs[key])

        #Add dimension variables
        dimvars = []
        wdims = []
        for dim, midim in zip(ncdims, dims):
            dimtype = midim.getDimType()
            dimname = dim.getShortName()
            if dimtype == DimensionType.T:
                var = self.addvar(dimname, 'int', [dim])
                var.addattr('units', 'hours since 1900-01-01 00:00:0.0')
                var.addattr('long_name', 'Time')
                var.addattr('standard_name', 'time')
                var.addattr('axis', 'T')
                tvar = var
            elif dimtype == DimensionType.Z:
                var = self.addvar(dimname, 'float', [dim])
                var.addattr('axis', 'Z')
            elif dimtype == DimensionType.Y:
                var = self.addvar(dimname, 'float', [dim])
                var.addattr('axis', 'Y')
            elif dimtype == DimensionType.X:
                var = self.addvar(dimname, 'float', [dim])
                var.addattr('axis', 'X')
            else:
                var = None
            if not var is None:
                dimvars.append(var)
                wdims.append(midim)

        #Add variables
        for v in vars:
            var = self.addvar(v.name, v.dtype, v.dims)
            v.ncvariable = var
            if v.attributes is None:
                var.addattr('name', v.name)
            else:
                for attr in v.attributes:
                    var.addattr(attr.getName(), attr.getStringValue())

        #Create netCDF file
        self.ncfile.create()

        #Write dimension variable data
        for dimvar, dim in zip(dimvars, wdims):
            if dim.getDimType() == DimensionType.T:
                sst = datetime.datetime(1900, 1, 1)
                tt = miutil.nums2dates(dim.getDimValue())
                hours = []
                for t in tt:
                    hours.append((t - sst).total_seconds() // 3600)
                self.write(dimvar, np.array(hours))
            else:
                self.write(dimvar, np.array(dim.getDimValue()))
예제 #4
0
def ncwrite(fn, data, varname, dims=None, attrs=None, gattrs=None, largefile=False):
    """
    Write a netCDF data file from an array.
    
    :param: fn: (*string*) netCDF data file path.
    :param data: (*array_like*) A numeric array variable of any dimensionality.
    :param varname: (*string*) Variable name.
    :param dims: (*list of dimensions*) Dimension list.
    :param attrs: (*dict*) Variable attributes.
    :param gattrs: (*dict*) Global attributes.
    :param largefile: (*boolean*) Create netCDF as large file or not.
    """
    if dims is None:
        if isinstance(data, DimArray):
            dims = data.dims
        else:
            dims = []
            for s in data.shape:
                dimvalue = np.arange(s)
                dimname = 'dim' + str(len(dims))
                dims.append(dimension(dimvalue, dimname))

    #New netCDF file
    ncfile = addfile(fn, 'c', largefile=largefile)
    #Add dimensions
    ncdims = []
    for dim in dims:    
        ncdims.append(ncfile.adddim(dim.getShortName(), dim.getLength()))
    #Add global attributes
    ncfile.addgroupattr('Conventions', 'CF-1.6')
    ncfile.addgroupattr('Tools', 'Created using MeteoInfo')
    if not gattrs is None:
        for key in gattrs:
            ncfile.addgroupattr(key, gattrs[key])
    #Add dimension variables
    dimvars = []
    wdims = []
    for dim,midim in zip(ncdims,dims):
        dimtype = midim.getDimType()
        dimname = dim.getShortName()
        if dimtype == DimensionType.T:
            var = ncfile.addvar(dimname, 'int', [dim])
            var.addattr('units', 'hours since 1900-01-01 00:00:0.0')
            var.addattr('long_name', 'Time')
            var.addattr('standard_name', 'time')
            var.addattr('axis', 'T')
            tvar = var
        elif dimtype == DimensionType.Z:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'Z')
        elif dimtype == DimensionType.Y:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'Y')
        elif dimtype == DimensionType.X:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'X')
        else:
            var = None
        if not var is None:
            dimvars.append(var)
            wdims.append(midim)
    #Add variable
    var = ncfile.addvar(varname, data.dtype, ncdims)
    if attrs is None:    
        var.addattr('name', varname)
    else:
        for key in attrs:
            var.addattr(key, attrs[key])
    #Create netCDF file
    ncfile.create()
    #Write variable data
    for dimvar, dim in zip(dimvars, wdims):
        if dim.getDimType() == DimensionType.T:
            sst = datetime.datetime(1900,1,1)
            tt = miutil.nums2dates(dim.getDimValue())
            hours = []
            for t in tt:
                hours.append((t - sst).total_seconds() // 3600)
            ncfile.write(dimvar, np.array(hours))
        else:
            ncfile.write(dimvar, np.array(dim.getDimValue()))
    ncfile.write(var, data)
    #Close netCDF file
    ncfile.close()
예제 #5
0
def ncwrite(fn, data, varname, dims=None, attrs=None, largefile=False):
    """
    Write a netCDF data file.
    
    :param: fn: (*string*) netCDF data file path.
    :param data: (*array_like*) A numeric array variable of any dimensionality.
    :param varname: (*string*) Variable name.
    :param dims: (*list of dimensions*) Dimension list.
    :param attrs: (*list of attributes*) Attribute list.
    :param largefile: (*boolean*) Create netCDF as large file or not.
    """
    if dims is None:
        if isinstance(data, MIArray):
            dims = []
            for s in data.shape:
                dimvalue = minum.arange(s)
                dimname = 'dim' + str(len(dims))
                dims.append(dimension(dimvalue, dimname))
        else:
            dims = data.dims
    #New netCDF file
    ncfile = midata.addfile(fn, 'c')
    #Add dimensions
    ncdims = []
    for dim in dims:    
        ncdims.append(ncfile.adddim(dim.getShortName(), dim.getLength()))
    #Add global attributes
    ncfile.addgroupattr('Conventions', 'CF-1.6')
    ncfile.addgroupattr('Tools', 'Created using MeteoInfo')
    #Add dimension variables
    dimvars = []
    for dim,midim in zip(ncdims,dims):
        dimtype = midim.getDimType()
        dimname = dim.getShortName()
        if dimtype == DimensionType.T:
            var = ncfile.addvar(dimname, 'int', [dim])
            var.addattr('units', 'hours since 1900-01-01 00:00:0.0')
            var.addattr('long_name', 'Time')
            var.addattr('standard_name', 'time')
            var.addattr('axis', 'T')
            tvar = var
        elif dimtype == DimensionType.Z:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'Z')
        elif dimtype == DimensionType.Y:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'Y')
        elif dimtype == DimensionType.X:
            var = ncfile.addvar(dimname, 'float', [dim])
            var.addattr('axis', 'X')
        else:
            var = ncfile.addvar(dim.getShortName(), 'float', [dim])
            var.addattr('axis', 'null')
        dimvars.append(var)
    #Add variable
    var = ncfile.addvar(varname, data.dtype, ncdims)
    if attrs is None:    
        var.addattr('name', varname)
    else:
        for key in attrs:
            var.addattr(key, attr[key])
    #Create netCDF file
    ncfile.create()
    #Write variable data
    for dimvar, dim in zip(dimvars, dims):
        if dim.getDimType() == DimensionType.T:
            sst = datetime.datetime(1900,1,1)
            tt = miutil.nums2dates(dim.getDimValue())
            hours = []
            for t in tt:
                hours.append((t - sst).total_seconds() // 3600)
            ncfile.write(dimvar, minum.array(hours))
        else:
            ncfile.write(dimvar, minum.array(dim.getDimValue()))
    ncfile.write(var, data)
    #Close netCDF file
    ncfile.close()