R - 使用动物园计算日期范围内的总和

时间:2016-09-09 02:36:10

标签: r date sum range zoo

假设我有一个包含十年日常温度数据(C级)的数据框,如下所示:

mydf <- data.frame(Date = seq(as.Date("2001/1/1"), as.Date("2010/12/31"), by = "day"), Temp = runif(3652, 0, 40))

我正在尝试计算植物的生长日数。这是它的工作原理:在日期范围内,我需要整合日常温度和基础温度之间的差异,比如10摄氏度。为了使其更难,日期范围会持续数年。例如,我需要计算时间序列中所有年份的11月1日到3月31日之间的成长天数。根据&#34;算法&#34;,逻辑将是这样的:

t_base <- 10

for (each day between nov 1st and mar 31st) {
  sum (Temp - t_base)
}

如何使用zoo包执行此操作?

1 个答案:

答案 0 :(得分:1)

请注意,"yearmon“类变量的格式为年+压缩,其中压裂为1月为0,2月为1月12日,3月为2月12日等。ym以下为{与"yearmon"对应的Date向量,除了我们已添加两个月。ym然后分为年y(季节结束年)和月{{1} }(本赛季第一个月的月份为0,第二个月为1,...,第5个月为第4个季度,上个月为4个月)。m为真对于那些11月,12月,1月,2月或3月的数据点(相当于in.seas)。最后使用m <= 4来计算具有相同季节结束年份或{{1}的日期之间的累积总和计算总和。

ave

或者只是得到每个赛季的总和:

aggregate

请注意,library(zoo) z <- read.zoo(mydf) ym <- as.numeric(as.yearmon(index(z)) + 2/12) y <- floor(ym) # year of date's season end or this year if not in season m <- round(12 * (ym - y)) # month Nov = 0, Dec = 1, Jan = 2, Feb = 3, Mar = 4, ... in.seas <- m <= 4 Cum <- ave(z[in.seas], y[in.seas], FUN = function(x) cumsum(x - t_base)) 会在必要时将zoo对象Sum <- aggregate(z[in.seas], y[in.seas], function(x) sum(x - t_base)) 转换回数据框。