2016-10-19 1 views
0

utilisant comme source: How to concatenate monthly TRMM netCDF files into a single netCDF file using NCO or R on windows 7?Création/concaténer plusieurs dimensions NetCDF dans R

install.packages("ncdf4") 
library(ncdf4) 
install.packages("abind") 
library(abind) 
install.packages("RNetCDF") 
library(RNetCDF) 
install.packages("ncdf.tools") 
library(ncdf.tools) 
filenames=read.csv('TRMM.filenames.csv',head=F) 
filenames=as.character(filenames[,1]) 
n.lon=4 
n.lat=7 
NA.matrix=matrix(rep(NA,n.lon*n.lat),nrow=n.lon) 
prcp=array(NA.matrix,c(n.lon,n.lat,1)) 


for (i in 1:length(filenames)){ncdata=nc_open(filenames[i]) 
+ nc=ncvar_get(ncdata,"precipitation") prcp=abind(prcp,nc)} 

prcp=prcp[,,-1] 
dim(prcp) 
saveRDS(prcp,'TRMM.all.rds') 

j'ai pu créer un fichier rds. Cependant, je suis vraiment intéressé à l'enregistrer en tant que fichier nc. J'ai essayé de créer un nouveau fichier NetCDF avec 12 étapes (un pour chaque mois) de dimension temporelle par:

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) 

Maintenant, le défi est d'ajouter les données de précipitation pour chaque mois.
Après le premier script, j'ai essayé d'utiliser la fonction ncvar_put sans succès.

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) 

Pour que je glissai

Erreur dans ncvar_put (precip.nccreate, precip.ncvar, data2d, start = c (1),: objet 'precip.nccreate' non trouvé

erreur dans nc_create ("precip.nccreate.nc", precip.ncvar, force_v4 = FAUX,: objet 'precip.ncvar' not found

Quoi qu'il en soit, je suppose que je suis juste essayer de trouver un moyen facile de concaténer plusieurs fichiers netcdf en un seul netcdf.

Merci

+0

est-ce lié à python de quelque façon? –

+0

Existe-t-il un moyen de concaténer plusieurs netcdf en un seul netcdf en utilisant python? –

+0

@marie_r Comme je l'ai mentionné dans mes commentaires sur votre question précédente, il existe un moyen de le faire en utilisant python. Note en utilisant la syntaxe @ m'aurait notifié de votre dernier commentaire. Pouvez-vous lancer Python? –

Répondre

1

Depuis la dimension temporelle est illimitée, vous pouvez utiliser la commande de sous-officier ncrcat, par exemple,

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

Les fichiers TRMM ont aucune variable de temps ou dimension. Je ne pouvais pas obtenir d'outils NCO pour gérer cette situation, mais je ne suis pas un expert. Ma solution était d'utiliser python pour créer une copie du fichier tout en ajoutant une dimension temporelle et une valeur temporelle basée sur le nom du fichier d'entrée. Ensuite, en utilisant ncrcat comme @CharlieZender suggère. Désolé pour le long script.

#! /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() 

Cela vous laissera avec des fichiers out_xxxxx.nc dans le répertoire courant et ncrcat peut être utilisé.

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

dans le temps est fusion fait de cette manière avec CDO:

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

J'utilise cdo fréquemment pour manipuler des fichiers TRMM.