首页 > 解决方案 > 在设定的端点之间对时间序列的一部分求和

问题描述

我有一个雨量计数据的时间序列(xts),我希望能够从列表中汇总开始时间点和结束时间点之间的所有雨量。然后制作一个新的数据框,即 StormNumber 和 TotalRain 在那个时间

> head(RainGage)
                    Rain_mm
2019-07-01 00:00:00       0
2019-07-01 00:15:00       0
2019-07-01 00:30:00       0
2019-07-01 00:45:00       0
2019-07-01 01:00:00       0
2019-07-01 01:15:00       0
head(StormTimes)
  StormNumber       RainStartTime         RainEndTime
1           1 2019-07-21 20:00:00 2019-07-22 04:45:00
2           2 2019-07-22 11:30:00 2019-07-22 23:45:00
3           3 2019-07-11 09:15:00 2019-07-11 19:00:00
4           4 2019-05-29 17:00:00 2019-05-29 20:45:00
5           5 2019-06-27 14:30:00 2019-06-27 17:15:00
6           6 2019-07-11 06:15:00 2019-07-11 09:00:00

当我过去尝试做类似的事情时,我有从 SO 社区获得的这段代码(但提取数据而不是求和)。但是,我不知道它是如何工作的,所以我正在努力使其适应这种情况。

do.call(rbind, Map(function(x, y) RainGage[paste(x, y,  sep="/")], 
               StormTimes$RainStartTime, StormTimes$RainEndTime)

标签: rsumtime-series

解决方案


在这种情况下,我建议只编写自己的函数,然后使用它apply来实现你想要的,例如:

dates <- c('2019-07-01 00:00:00', '2019-07-01 00:15:00',
           '2019-07-01 00:30:00', '2019-07-01 00:45:00',
           '2019-07-01 01:00:00', '2019-07-01 01:15:00')
dates <- as.POSIXct(strptime(dates, '%Y-%m-%d %H:%M:%S'))
mm <- c(0, 10, 10, 20, 0, 0)
rain <- data.frame(dates, mm)

number <- c(1,2)
start  <- c('2019-07-01 00:00:00','2019-07-01 00:18:00')
start  <- as.POSIXct(strptime(start, '%Y-%m-%d %H:%M:%S'))
end    <- c('2019-07-01 00:17:00','2019-07-01 01:20:00')
end    <- as.POSIXct(strptime(end, '%Y-%m-%d %H:%M:%S'))
storms <- data.frame(number, start, end)

# Sum of rain
f = function(x, output) {
    # Get storm number
    number = x[1]
    # Get starting moment
    start = x[2]
    # Get ending moment
    end = x[3]
    # Calculate sum
    output <- sum(rain[rain$dates >= start & rain$dates < end, 'mm'])
}

# Apply function to each row of the dataframe
storms$rain <- apply(storms, 1, f)
print(storms)

这产生:

   number                start                  end  rain
1       1  2019-07-01 00:00:00  2019-07-01 00:17:00    10
2       2  2019-07-01 00:18:00  2019-07-01 01:20:00    30

rain因此,现在的一列storms包含 的总和rain$mm,这就是您所追求的。

希望对您有所帮助!


推荐阅读