2013-12-16 63 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) 
相關問題