0

これをソースとして使用: Windows 7 で NCO または R を使用して、毎月の TRMM netCDF ファイルを単一の netCDF ファイルに連結する方法は?

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')

rdsファイルを作成できました。ただし、ncファイルとして保存することに本当に興味があります。12 ステップ (各月に 1 つ) の時間ディメンションを持つ新しい netCDF ファイルを次のように作成してみました。

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)

ここでの課題は、降水データを各月に追加することです。
最初のスクリプトに従って、ncvar_put関数を使用してみましたが成功しませんでした。

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 )

私が得たもの

ncvar_put(precip.nccreate, precip.ncvar, data2d, start = c(1), のエラー: オブジェクト 'precip.nccreate' が見つかりません

nc_create("precip.nccreate.nc", precip.ncvar, force_v4 = FALSE, のエラー: オブジェクト 'precip.ncvar' が見つかりません

とにかく、複数の netcdf ファイルを単一の netcdf に連結する簡単な方法を見つけようとしているだけだと思います。

ありがとう

4

3 に答える 3

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
于 2016-10-25T15:40:32.583 に答える