2016-10-19 4 views
0
における多次元のNetCDF

を連結/作成します。しかし、私は本当にncファイルとして保存することに興味があります。今の課題は、各月に降水量データを追加することですソースとしてこれを使用してR

dimx <- ncdim_def("Lon", "degreesE", as.double(-90:-87)) 
dimy <- ncdim_def("Lat", "degreesN", as.double(14:16)) 
dimTime <- ncdim_def("Time", "months", 1:12, unlim=TRUE) 
dimlist<-list(dimx,dimy,dimTime) 
precip.ncvar<- ncvar_def("Precip", "mm/hr", dimlist, -1, longname="Precipitation", prec="float") 
precip.nccreate<- nc_create("precip.nccreate.nc", precip.ncvar, force_v4=FALSE, verbose=FALSE) 
nc_close(precip.nccreate) 

:私はによって12段階(各月の1)を使用して新しいnetCDFファイルを作成する時間ディメンションを試してみました。
最初のスクリプトに続いて、私はncvar_put機能を成功させずに使ってみました。 オブジェクトのprecip.nccreate」は

が見つかりません:

filenames1=read.csv('TRMM.filenames.csv',head=F) 
filenames1=as.character(filenames1[,1]) 

for (i in 1:length(filenames1)){ncdata1=nc_open(filenames1[i]) 
nc1=ncvar_get(ncdata1,"precipitation") 
prcp1=abind(prcp1,nc1)} 

n.lon1=4 
n.lat1=7 

data2d<-(4*7) 

for (i in 1:length(filenames1)) 
    ncvar_put(precip.nccreate, precip.ncvar, data2d, start=c(1), count=c(1)) 

precip.nccreate<- nc_create("precip.nccreate.nc", precip.ncvar, force_v4=FALSE, verbose=FALSE) 

は私がprecip.nccreate、precip.ncvar、data2d、= cは(1)、開始(ncvar_putに

エラーを得たために、 nc_createで

エラー( "precip.nccreate.nc"、precip.ncvar、force_v4 = FALSE、:オブジェクトのprecip.ncvar「とにかく

を見つけていない、私はちょうど見つけようとしていると思います複数のnetcdfファイルを1つのnetcdfに連結する簡単な方法です。

おかげ

+0

これはPythonに関係していますか? –

+0

pythonを使って複数のnetcdfを1つのnetcdfに連結する方法はありますか? –

+0

@marie_r前の質問に対する私のコメントで述べたように、Pythonを使ってそれを行う方法があります。 @構文を使用すると、あなたに最後のコメントが通知されます。あなたはPythonを実行できますか? –

答えて

1

時間ディメンションは無制限ですので、あなたはNCOのncrcatコマンドを使用することができ、例えば、

ncrcat in1.nc in2.nc ... out.nc 
ncrcat in*.nc out.nc 
0

TRMMファイルが何の時間変数またはディメンションを持っていません。私はその状況に対処するためのNCOツールを手に入れることができませんでしたが、私は専門家ではありません。私のソリューションは、入力ファイル名に基づいて時間ディメンションと時間値を追加しながら、pythonを使ってファイルのコピーを作成することでした。次に、@CharlieZenderとしてncrcatを使用すると示唆されます。長いスクリプトには申し訳ありません。

#! /usr/bin/env python 
import os 
import glob 
import netCDF4 
import datetime 

# get all the TRMM files with file names like, add a time dimension and time variable value from the file name. 
# E.G. 3B43.19980101.7.HDF.nc, 3B43.19980201.7.HDF.nc, 3B43.20160701.7.HDF.nc 
# Creates a list of monthly files which can be concatenated by NCO Tools ncrcat command. 

# assumes all the 3B43.*.nc files are in the subdir files/ 
# creates out_3B43.*.nc in the current directory 
infiles = glob.iglob("files/*.nc") 

# add time dimension to these gridded variables. we only care about precipiation. 
#wanted_vars = ['precipitation', 'relativeError', 'gaugeRelativeWeighting'] 
wanted_vars = ['precipitation'] 

for infile in sorted(infiles): 
    try: 
    nci = netCDF4.Dataset(infile, 'r') 
    except RuntimeError: 
    print "ERROR: Could not open " + infile 
    exit() 

    ofile = 'out_' + os.path.basename(infile) 

    try: 
    nco = netCDF4.Dataset(ofile,'w',clobber=True, format=nci.data_model) 
    except RuntimeError: 
    print "ERROR: Could not open " + ofile 
    exit() 

    # copy global attributes 
    in_g_attdict = nci.__dict__ 
    # copy dimensions 
    nco.setncatts(in_g_attdict) 
    for dname, d in nci.dimensions.iteritems(): 
    if d.isunlimited(): 
     d_size = None 
    else: 
     d_size = len(d) 
    nco.createDimension(dname, d_size) 
    # Add a time dimension, as unlimited, None means unlimited. 
    nco.createDimension('time', None) 

    # Get YYYYMMDD from file name you could use dy = 15 to reflect that these are monthly files. 
    file_date = infile.split('.')[1] 
    yr = file_date[0:4] 
    mo = file_date[4:6] 
    dy = file_date[6:] 
    odt = datetime.datetime(year=int(yr), month=int(mo), day=int(dy)) 

    # create the time variable. Note: the time variable must go first to be the outer or record dimension for ncrcat 
    time_v = nco.createVariable('time', 'int32', ('time')) 
    time_v.setncattr('standard_name', 'time') 
    time_v.setncattr('long_name', 'reference time of data field') 
    time_v.setncattr('axis', 'T') 
    # for time_urnits, I've used seconds since the epoch. But I'm guessing that 'days since XXX' should work as well. But harded to 
    time_v.setncattr('units', 'seconds since 1970-01-01 00:00:00 UTC') 
    # calculate the number. 
    ntime = netCDF4.date2num(odt, time_v.units) 
    time_v[:] = ntime 

    # Copy variables, skip the wanted_vars, for now 
    for iname, ivar in nci.variables.iteritems(): 
    if iname in wanted_vars: 
     continue 
    ovar = nco.createVariable(iname, ivar.dtype, ivar.dimensions) 
    iattdict = ivar.__dict__ 
    ovar.setncatts(iattdict) 
    ovar[:] = ivar[:] 
    # now copy the wanted 2-D gridded variables, adding a time dimension, as axis 0 
    for data_var_name in wanted_vars: 
    ivar = nci.variables[data_var_name] 
    # original precipation variable is dimensioned by nlon,nlat 
    ovar = nco.createVariable(data_var_name, ivar.dtype, ('time', 'nlon', 'nlat')) 
    iattdict = ivar.__dict__ 
    ovar.setncatts(iattdict) 
    ovar[0,:,:] = ivar[:] 

    nci.close() 
    nco.close() 

exit() 

これにより、現在のディレクトリにout_xxxxx.ncファイルが残され、ncrcatを使用できます。時間内にマージ

ncrcat -H -h out_3B43.19980101.7.HDF.nc out_3B43.19980201.7.HDF.nc final.nc 
0

CDOと、このように行われます:

cdo mergetime in1.nc in2.nc ... in12.nc out.nc 

私はTRMMのファイルを操作するために、頻繁にCDOを使用しています。

関連する問題