Суммировать часть временного ряда между заданными конечными точками - PullRequest
1 голос
/ 17 января 2020

У меня есть временной ряд (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)

1 Ответ

1 голос
/ 17 января 2020

В этом случае я бы предложил написать свою собственную функцию и затем использовать 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, то есть то, что вы ищете.

Надеюсь, что это поможет вам!

...