我有一组等间距的时间序列,其中包含每日平均观测数据。
最简单的方法是如何计算季节平均值? 季节应该遵循气象学术语,即DJF(=冬季:12月,1月,2月),MAM,JJA和SON。
这意味着12月的值来自x-1年。
月平均值的计算在此处得到了很好的展示: How to calculate a monthly mean? 在计算季节平均值时,可以按照此思路进行。 然而,有几个注意事项使其不太透明,因此必须小心!
我之前在一个旧帖子中已经处理了这个问题的一小部分: How to switch rows in R? 现在这里是完整的说明: 0:制作随机时间序列
这是给出的。
最简单的方法是如何计算季节平均值? 季节应该遵循气象学术语,即DJF(=冬季:12月,1月,2月),MAM,JJA和SON。
这意味着12月的值来自x-1年。
月平均值的计算在此处得到了很好的展示: How to calculate a monthly mean? 在计算季节平均值时,可以按照此思路进行。 然而,有几个注意事项使其不太透明,因此必须小心!
我之前在一个旧帖子中已经处理了这个问题的一小部分: How to switch rows in R? 现在这里是完整的说明: 0:制作随机时间序列
ts.pdsi <- data.frame(date = seq(
from=as.Date("1901-01-01"),
to=as.Date("2009-12-31"),
by="day"))
ts.pdsi$scPDSI <- rnorm(dim(ts.foo)[1], mean=1, sd=1) # add some data
第一步:使用seas包并将季节性添加到您的时间序列中,该序列必须格式化为一个数据框。
library(seas)
# add moth/seasons
ts.pdsi$month <- mkseas(ts.pdsi,"mon") # add months
ts.pdsi$seas <- mkseas(ts.pdsi,"DJF") # add seasons
ts.pdsi$seasyear <- paste(format(ts.pdsi[,1],"%Y"),
ts.pdsi$seas ,sep="") # add seasyears, e.g. 1950DJF
这是给出的。
> head(ts.pdsi)
date scPDSI month seas seasyear
1 1901-01-01 -0.10881074 Jan DJF 1901DJF
2 1901-02-01 -0.22287750 Feb DJF 1901DJF
3 1901-03-01 -0.12233192 Mär MAM 1901MAM
4 1901-04-01 -0.04440915 Apr MAM 1901MAM
5 1901-05-01 -0.36334082 Mai MAM 1901MAM
6 1901-06-01 -0.52079030 Jun JJA 1901JJA
第二步:你可以使用列$seasyear,按照上述方法计算季节平均值。
> MEAN <- tapply(pdsi$scPDSI, ts.pdsi$seasyear, mean, na.rm = T)
> head(MEAN)
1901DJF 1901JJA 1901MAM 1901SON 1902DJF 1902JJA
-0.45451556 -0.72922229 -0.17669396 -1.12095590 -0.86523850 -0.04031273
注意:春季(MAM)和夏季(JJA)由于严格的字母排序而被交换了。
第三步:将其切换回来。
foo <- MEAN
for(i in 1:length(MEAN)) {
if (mod (i,4) == 2) {
foo[i+1] <- foo[i] #switch 2nd 3rd row (JJA <-> MAM)
foo[i] <- MEAN[i+1]
}
}
# and generate new names for the array
d <- data.frame(date=seq(from=as.Date("1901-01-01"), to=as.Date("2009-12-31"), by="+3 month"))
d$seas <- mkseas(d,"DJF")
d$seasyear <- paste(format(d[,1],"%Y"), d$seas ,sep="")
names(foo)<-d$seasyear # add right order colnames
MEAN <-foo
最终,这导致了一个季节平均数的时间序列。我认为这太复杂了,而且我猜想周围有更简单的解决方案。
此外,这个解决方案在冬季DJF也存在一个非常大的问题:12月份还没有从前一年中选择。这很容易修复(我猜),但使给定的方式变得更加复杂。
我真的希望有更好的想法!
dd <- c(Sys.Date(), as.Date(c("2013-11-30", "2013-12-01"))); season_year <- as.numeric(format(dd + 31, "%Y"))
. - Josh O'Brien