如何将每日价值汇总限制为月度和年度总计?

时间:2013-12-13 00:09:42

标签: r date time-series plyr zoo

我有一个动物园对象(stn),包含每日数据的长记录(日期与降雨量)。我用过hydoTSM包

(m < - daily2monthly(stn,FUN = sum,na.rm = TRUE))

工作正常但我想只允许聚合几个月,每天至少有20条记录。对于年度,应提供至少10个月的记录。任何人都可以建议一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果使用 plyr 是一个选项,这是一种方法。您必须将动物园对象stn放入数据框中。

rain <- data.frame(date=c("1987-01-01", "1987-01-02", "1987-01-03", "1988-10-01", "1988-11-02", "1988-11-01"), 
              pcp=c(2, 0.6, 1, 2.7, 1.1, 1.3)
           )

rain$Year <- 1900+as.POSIXlt(rain$date)$year
rain$Month <-1+as.POSIXlt(rain$date)$mon
rain$Day <-as.POSIXlt(rain$date)$mday

annualAgg <- function(df) {
   if(length(unique(df$Month))<10) return(NULL) #aggregate only if <10 months in that year
  mean(df$pcp)
}

monthlyRainAgg <- function(df) {
  if(length(unique(df$Day))<20) return(NULL) #aggregate monthly only if <20 days in that month
  mean(df$pcp)
}

library(plyr)
## Call the functions above using ddply
# ddply sends the functions thinly sliced df's
monthly.agg.df <- ddply(rain, .(Year, Month), monthlyRainAgg)
monthly.agg.df

annual.agg <-  ddply(rain, .(Year), annualAgg)
annual.agg