Предположим, что нашим вводом является объект POSIXct zoo z
, указанный в примечании в конце.
Создайте вектор символов times
, который имеет один элемент на элемент z
и имеет видHH: MM. Затем создайте логический ok
, который указывает, какое время находится между указанными граничными значениями. z[ok]
тогда z
уменьшается до этих значений. Наконец, для каждого дня примените sum
(при желании можете использовать какую-то другую функцию), используя aggregate.zoo
:
times <- format(time(z), "%H:%M")
ok <- times >= "12:01" & times <= "12:03"
aggregate(z[ok], as.Date, sum)
## 2006-08-01 2006-08-02
## 75 375
раз в полночь
Версия предназначена для случая, когда время колеблетсяполночь. Обратите внимание, что порядок значений, отправляемых в функцию, не является исходным порядком, но если функция симметрична, это не имеет значения.
times <- format(time(z), "%H:%M")
ok <- times >= "23:58" | times <= "00:12"
aggregate(z[ok], (as.Date(format(time(z))) + (times >= "23:58"))[ok], sum)
## 2006-08-02
## 41
Изменение
Блок предыдущего кода работает, если функцияявляется симметричным по компонентам своего аргумента (что имеет место для многих функций, таких как mean
и sum
), но если бы функция не была симметричной, нам потребовался бы немного другой подход. Мы определяем to.sec
, который переводит строку ЧЧ: ММ в числовые секунды и вычитает to.sec("23:58")
из каждой даты-времени POSIXct. Тогда в качестве компонентов z
сохраняются те, чье преобразованное время преобразуется в строки символов ЧЧ: ММ, которые меньше «00:14».
to.sec <- function(x) with(read.table(text = x, sep = ":"), 3600 * V1 + 60 * V2)
times <- format(time(z) - to.sec("23:58"), "%H:%M")
ok <- times <= "00:14"
aggregate(z[ok], as.Date(time(z)[ok] - to.sec("23:58")), sum)
## 2006-08-01
## 41
Примечание
Lines <- "datetime val
2006-08-01T12:00 23
2006-08-01T12:01 24
2006-08-01T12:02 25
2006-08-01T12:03 26
2006-08-01T12:04 27
2006-08-01T12:05 28
2006-08-01T12:06 29
2006-08-01T23:58 20
2006-08-02T00:01 21
2006-08-02T12:00 123
2006-08-02T12:01 124
2006-08-02T12:02 125
2006-08-02T12:03 126
2006-08-02T12:04 127"
library(zoo)
z <- read.zoo(text = Lines, tz = "", header = TRUE, format = "%Y-%m-%dT%H:%M")
РЕДАКТИРОВАТЬ
Пересмотрел несимметричный код и упростил все фрагменты кода.