Как разбить хронографический объект даты и времени в зоопарке для агрегации - PullRequest
1 голос
/ 25 января 2010

Я импортировал данные с пятиминутным интервалом в объект зоопарка, где индекс представляет собой хрон с датой и временем:

> d
(09/09/09 16:45:10)  13.2  5.8
(09/09/09 16:50:10)   8.3  0.7
(09/09/09 16:55:10)   4.7  0.7
(09/09/09 17:00:10)   6.6  0.7
(09/09/09 17:05:10)   4.6  0.7

Я пытаюсь агрегировать с интервалом в четверть часа.

Я нашел способ сделать это, преобразовав обратно в строку, но результат больше не является зоопарком.

> r =data.frame(aggregate(d,trunc(chron(times=substr(as.character(index(d)),11,18)),"00:15:00"), mean)
> r
00:00:00   0.5644444
00:15:00   0.5400000
00:30:00   0.5488889
00:45:00   0.6155556
01:00:00   0.3422222

Хотя я могу это изобразить, я пытался сделать это изначально. Я обнаружил, что совокупность с зоопарком может делать день и час, но я не мог разделить час.

Ответы [ 3 ]

4 голосов
/ 25 января 2010

Я не верю, что есть какой-то способ сделать это встроенным в зоопарк или хрон, но вы можете создать свою собственную функцию с помощью небольшой математики. Вот, пожалуйста:

trunc.minutes <- function (x, n.minutes) 
{
    if (!inherits(x, "times")) 
        x <- as.chron(x)
    x <- as.numeric(x)
    sec <- round(24 * 3600 * abs(x - floor(x)))
    h <- (sec%/%(n.minutes*60))/(60/n.minutes)
    hour <- as.integer(h)
    minutes <- (h %% hour) * 60
    chron(dates=chron::dates(x), times=times(paste(hour, minutes, "00", sep=":")))
}

Вот пример использования:

dts <- chron::dates(c("02/27/92", "02/27/92", "01/14/92",
                "02/28/92", "02/01/92"))
tms <- times(c("23:03:20", "23:29:56", "01:03:30",
                "18:21:03", "16:56:26"))     
x <- chron(dates = dts, times = tms) # original dates
x
[1] (02/27/92 23:03:20) (02/27/92 22:29:56) (01/14/92 01:03:30)
[4] (02/28/92 18:21:03) (02/01/92 16:56:26)
trunc.minutes(x, 15) # new dates at 15 minute intervals
[1] (02/27/92 23:00:00) (02/27/92 22:15:00) (01/14/92 01:00:00)
[4] (02/28/92 18:15:00) (02/01/92 16:45:00)
trunc.minutes(x, 30) # new dates at 30 minute intervals
[1] (02/27/92 23:00:00) (02/27/92 22:00:00) (01/14/92 01:00:00)
[4] (02/28/92 18:00:00) (02/01/92 16:30:00)

Наконец, теперь вы можете использовать эту функцию для агрегирования данных:

ts.zoo <- zoo(rnorm(5), x) # a zoo time series

Или просто используйте эти новые даты для агрегирования (посмотрите, как это сворачивает второй пример, поскольку в этом окне есть два значения):

> aggregate(ts.zoo, trunc.minutes(x, 15), mean)
(01/14/92 01:00:00) (02/01/92 16:45:00) (02/27/92 23:00:00) (02/27/92 23:15:00) 
         -0.6738659          -0.4844803           0.7968155          -1.3571121 
(02/28/92 18:15:00) 
          0.7625861 
> aggregate(ts.zoo, trunc.minutes(x, 30), mean)
(01/14/92 01:00:00) (02/01/92 16:30:00) (02/27/92 23:00:00) (02/28/92 18:00:00) 
         -0.6738659          -0.4844803          -0.2801483           0.7625861 
2 голосов
/ 30 марта 2010

chron имеет метод trunc.times, поэтому мы можем сделать это:

library(zoo)
library(chron)
z <- zoo(1:5, 
   chron(c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92"),
   c("23:03:20", "23:29:56", "01:03:30", "18:21:03", "16:56:26")))
aggregate(z, function(x) trunc(x, "00:15:00"), mean)
1 голос
/ 26 января 2010

Учитывая идею Шейна, я немного ее изменил ... Первоначальный вопрос заключался в том, как объединить данные о количестве минут за час и избавиться от даты. Кроме того, поскольку математике раньше не нравилась полночь, я использую разбор строк.

# Where X is a zoo obj with chron timestamps containing both time & date
# and min is like "00:30:00" for half hour intervals
> trunc.chrontime = function (x, min)
  {
    if (!inherits(x, "times")) 
        x = as.chron(x)
    s = substr(as.character(x),11,18)
    c = chron(times=s)
    trunc(c,min)
  }

> s = aggregate(d,trunc.minstr(index(d),"00:30:00"),mean)
s
00:00:00  0.5522222 0.4988889 0.006666667
00:30:00  0.5822222 0.5366667 0.012222222
01:00:00  0.3388889 0.4455556 0.000000000
01:30:00  0.3422222 0.4344444 0.000000000
02:00:00  0.3366667 0.4366667 0.000000000 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...