In [9]:
import datetime
import qcio
import qcutils
from netCDF4 import Dataset

In [10]:
def nc_read_access(ncname):
    """ Reads an ACCESS netCDF file."""
    # open the input file
    ncin = Dataset(ncname,mode="r")
    # read the global attributes
    ds = qcio.DataStructure()
    for attr in ncin.ncattrs():
        ds.globalattributes[attr] = getattr(ncin,attr)
    # copy the dimensions
    for dimname, dimvalue in ncin.dimensions.iteritems():
        length = len(dimvalue)
        if ncin.dimensions[dimname].isunlimited(): length = 0
        ds.dimensions[dimname] = length
    # copy the variables and their attributes
    for varname, varin in ncin.variables.iteritems():
        ds.series[varname] = {}
        ds.series[varname]["Data"] = varin[:]
        ds.series[varname]["Dims"] = ncin.variables[varname].dimensions
        if len(varin.ncattrs())!=0:
            ds.series[varname]["Attr"] = {}
            for attr in varin.ncattrs():
                ds.series[varname]["Attr"][attr] = getattr(varin,attr)
    return ds

In [11]:
def nc_write_access(ds,ncname):
    """ Writes an ACCESS netCDF file."""
    ncout = Dataset(ncname,mode="w",format="NETCDF3_CLASSIC")
    # create the dimensions
    for dim in ds.dimensions.keys():
        ncout.createDimension(dim,ds.dimensions[dim])
    # write the global attributes
    for gattr in ds.globalattributes.keys():
        setattr(ncout,gattr,ds.globalattributes[gattr])
    for varname in ds.series.keys():
        dt = qcio.get_ncdtype(ds.series[varname]["Data"])
        ncvar = ncout.createVariable(varname,dt,ds.series[varname]["Dims"])
        ncvar[:] = ds.series[varname]["Data"].tolist()
        if "Attr" in ds.series[varname].keys():
            for attr in ds.series[varname]["Attr"]:
                setattr(ncvar,attr,ds.series[varname]["Attr"][attr])
    ncout.close()

In [12]:
ncname=qcio.get_filename_dialog()
ds=nc_read_access(ncname)
outname = ncname.replace(".nc","_out.nc")
for varname in ds.series.keys():
    if "time" in ds.series[varname]["Dims"]:
        ndims=len(ds.series[varname]["Dims"])
        dlist=[]
        for dim in ds.series[varname]["Dims"]:
            if dim=="time":
                dlist.extend([1])
            else:
                dlist.extend([ds.dimensions[dim]])
        zeros2add = numpy.zeros(tuple(dlist))
        ds.series[varname]["Data"]=numpy.append(ds.series[varname]["Data"],zeros2add,axis=0)
for varname in ["valid_date","base_date"]:
    dt=datetime.datetime.strptime(str(int(ds.series[varname]["Data"][-2])),"%Y%m%d")
    dt=dt+datetime.timedelta(days=1)
    ds.series[varname]["Data"][-1]=datetime.datetime.strftime(dt,"%Y%m%d")
ds.series["accum_prcp"]={}
ds.series["accum_prcp"]["Dims"]=("time","lat","lon")
d1=len(ds.series["valid_date"]["Data"])
d2=ds.dimensions["lat"]
d3=ds.dimensions["lon"]
ds.series["accum_prcp"]["Data"]=numpy.ones((d1,d2,d3))*1E+36
ds.series["accum_prcp"]["Attr"]={"accum_type":"accumulative",
                                 "accum_units":"hrs",
                                 "accum_value":3,
                                 "grid_type":"spatial",
                                 "level_type":"single",
                                 "long_name":"accumulated precipitation",
                                 "missing_value":1e+36,
                                 "stash_code":5226,
                                 "units":"mm"}
nc_write_access(ds,outname)

In [ ]: