我为Hadley Sea Surface Temperature observations下载了多个.txt.gz文件。数据已解压缩,导致ASCII format中出现多个.txt文件 我有以下文件(R脚本是我正在处理的文件):
list.files()
[1] "Get_SST_Data.R" "HadISST1_SST_1931-1960.txt" "HadISST1_SST_1931-1960.txt.gz"
[4] "HadISST1_SST_1961-1990.txt" "HadISST1_SST_1961-1990.txt.gz" "HadISST1_SST_1991-2003.txt"
[7] "HadISST1_SST_2004.txt" "HadISST1_SST_2005.txt" "HadISST1_SST_2006.txt"
[10] "HadISST1_SST_2007.txt" "HadISST1_SST_2008.txt" "HadISST1_SST_2009.txt"
[13] "HadISST1_SST_2010.txt" "HadISST1_SST_2011.txt" "HadISST1_SST_2012.txt"
[16] "HadISST1_SST_2013.txt"
我希望自1950年以来能够利用温度数据为海面温度制作数字矢量,最终制作时间序列图。
看起来像这样
[P.S。这仅供参考......]
提前致谢!
答案 0 :(得分:3)
[编辑:仅在Linux上测试]
R能够读取NetCDF格式(http://www.metoffice.gov.uk/hadobs/hadisst/data/HadISST_sst.nc.gz)。您可以使用“raster”包在解压缩后读取这些数据,例如:
library(raster)
library(xts)
library(caTools)
一些时间定义:
startYear <- 1950 # start of the period
endYear <- 2011 # end of the period
subp <- '1951-01-01/1980-12-01' # period for the climatology calculation
打开文件:
sst <- brick('HadISST_sst.nc')
Date <- substr(names(sst),2,11)
Date <- gsub('\\.', '\\-', Date)
Date <- as.Date(Date)
dstart <- paste(startYear,'01','01',sep='-'); dstart <- grep(dstart, Date)
dend <- paste(endYear,'12','01',sep='-'); dend <- grep(dend, Date)
sst <- subset(sst, dstart:dend)
Date <- Date[dstart:dend]
提取特定点的时间系列(lat = 35,lon = 120):
tserie <- as.vector(extract(sst, cbind(116, -35)))
tserie <- xts(tserie, order.by=Date)
计算subp期间的气候学:
clim <- as.numeric()
for(ii in 1:12){
clim[ii] <- mean(tserie[subp][(.indexmon(tserie[subp])+1) == ii])
}
clim <- xts(rep(clim, length(tserie)/12), order.by=Date)
计算异常:
tserie <- tserie - clim
绘制结果:
par(las=1)
plot(tserie, t='n', main='HadISST')
lines(tserie, col='grey')
lines(xts(runmean(tserie, 12), order.by=Date), col='red', lwd=2)
legend('bottomleft', c('Monthly anomaly','12-month moving avg'), lty=c(1,1), lwd=c(1,2), col=c('grey','red'))
答案 1 :(得分:3)
NetCDF
绝对是一个更好的方法,因为ascii数据的格式非常糟糕。也就是说,这是一个读取您下载的数据的函数。
read.things <- function(f) {
# f is the file path of your ascii data
require(raster)
d <- readLines(f)
d <- split(d, rep(1:12, each=181))
d <- lapply(d, function(x) read.fwf(textConnection(x), rep(6, 360),
skip=1, stringsAsFactors=FALSE,
na.strings=c(-1000, -32768)))
d <- lapply(d, function(x) sapply(x, as.numeric))
out <- stack(lapply(d, raster))
names(out) <- month.abb
extent(out) <- c(-180, 180, -90, 90)
out/100
}
请注意,我已将100%冰细胞(-100
)和地面细胞(-32768
)设为NA
。
下面,我们下载其中一个文件(1Mb)作为示例:
download.file(
'http://www.metoffice.gov.uk/hadobs/hadisst/data/HadISST1_SST_2004.txt.gz',
destfile= {f <- tempfile()})
s <- read.things(f)
s
# class : RasterBrick
# dimensions : 180, 360, 64800, 12 (nrow, ncol, ncell, nlayers)
# resolution : 1, 1 (x, y)
# extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
# min values : -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10
# max values : 30.34, 30.58, 30.43, 30.50, 30.83, 31.39, 32.71, 33.40, 32.61, 31.52, 30.60, 30.51
library(rasterVis)
levelplot(s, at=seq(min(s[], na.rm=T), max(s[], na.rm=T), len=100),
col.regions=colorRampPalette(c('#2c7bb6', '#abd9e9', '#ffffbf',
'#fdae61', '#d7191c')))
答案 2 :(得分:1)
你得到错误,因为如果你看看日期的结构,他们总是从16日到16日。如果你替换:
dstart <- paste(startYear,'01','01',sep='-'); dstart <- grep(dstart, Date)
dend <- paste(endYear,'12','01',sep='-'); dend <- grep(dend, Date)
有,
dstart <- paste(startYear,'01','16',sep='-'); dstart <- grep(dstart, Date)
dend <- paste(endYear,'12','16',sep='-'); dend <- grep(dend, Date)
它会起作用。