2013-12-16 75 views
4

我在R上比较新。我试图从netCDF文件中获取不同点(lat,lon)的温度数据的时间序列。 我的示例数据文件是herehere是小文件。我已经试过的netCDF包和代码我迄今使用从NetCDF中提取一个点(lon,lat)的时间序列R

library(ncdf) 
obsdata = open.ncdf("obs.nc") 

print.ncdf(obsdata) 

obsdatadates = obsdata$dim$time$vals 
obsdatadates = as.Date(obsdatadates,origin = '1950-01-01') 
obsdatadates 
obsoutput = get.var.ncdf(obsdata, varid = 'tasmin', start = c(1,1,1), 
         count = c(1,1,22280)) 
dim(obsoutput) 
datafinal=merge(obsdatadates,obsoutput) 

谁能帮助我获得时间序列的另一个数据帧(第一列)以及数据的价值的特定点(纬度,经度)该数据。 在这种情况下,我正在寻找特定纬度点的时间序列(1950-01-01至2010-12-31,其数据为)(对许多兴趣点重复)以及给定变量(在此案件tasmin)。 您的帮助,将不胜感激。 谢谢 aseem

+2

你想我们下载一个14.71 MB的数据文件!?!?听起来像这是一个“为我做我的项目”的请求。 –

+0

请查看[** here **](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)了解如何创建_minimal_可重现的例子,例如使用'dput'。 – Henrik

+1

@DWin现在第二个文件相对很小,只需2.4 MB – Cirrus

回答

6

也许使用raster包,这将不会对所有的NetCDF文件的工作,但它确实为你:

library(raster) 
## brick reads all 22280 layers 
r <- brick("obs.nc", varname = "tasmin") 
## extract works for all time steps 
vals <- extract(r, matrix(c(-120, 52.5), ncol = 2)) 

dim(vals) 
## [1]  1 22280 

注意,给出了一个1行,多列的矩阵,因为我只给了一个点extract()

(提取很简单,直接从最近的单元格复制,使用方法=“双线性”做内插)。其他选项请参阅?extract

+0

谢谢你的建议,它的帮助。谢谢 :) – Cirrus

4

下面我将如何着手ncdf做到这一点:

library(ncdf) 
obsdata = open.ncdf("obs1.nc") 
obsdatadates = as.Date(obsdata$dim$time$vals,origin = '1950-01-01') 
#Get the whole data first 
obsoutput = get.var.ncdf(obsdata, varid = 'tasmin') 
#Prepare your points of interest 
points_of_interest = data.frame(lat=seq(1,8,by=2),lon=c(1,5,3,6)) 
#Subset your data accordingly 
data_at_point = apply(points_of_interest,1,function(x)obsoutput[x[1],x[2],]) 
#Turn it into a dataframe 
data_at_point = as.data.frame(data_at_point) 
#Add the dates to the dataframe 
data_at_point$Date = obsdatadates 
1

的“ncdf'包被弃用:http://cirrus.ucsd.edu/~pierce/ncdf/

更新与ncdf4包:

library(ncdf4) 
obsdata <- nc_open("obs1.nc") 
print(obsdata) # check that dims are lon-lat-time 

# location of interest 
lon <- 6 # longitude of location 
lat <- 51 # latitude of location 

# get dates 
obsdatadates <- as.Date(obsdata$dim$time$vals, origin = '1950-01-01') 

# get values at location lonlat 
obsoutput <- ncvar_get(obsdata, varid = 'tasmin', 
        start= c(which.min(abs(obsdata$dim$longitude$vals - lon)), # look for closest long 
          which.min(abs(obsdata$dim$latitude$vals - lat)), # look for closest lat 
          1), 
        count = c(1,1,-1)) #count '-1' means 'all values along that dimension'that dimension' 
# create dataframe 
datafinal <- data.frame(dates= obsdatadates, obs = obsoutput)