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 [ ]: