Создать массив дат начала / конца дня в R - PullRequest
3 голосов
/ 06 декабря 2011

Я использую R для анализа временных рядов, используя zoo и chron.У меня есть объект зоопарка с большим количеством данных, и мне нужно иметь возможность использовать функцию window для подстановки данных только на один день, затем на следующие дни, затем на следующий и т. Д.

Я попытался найти самый простой способ создания массива с датой каждого дня в определенном периоде и нашел следующее:

orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))

Используется юлианский день.нотации, и имеет 1825 дней (365 * 5 - так пять лет), начиная с первого дня моего периода даты.Затем я пытаюсь выполнить цикл for, используя каждый из элементов этого массива:

for (date in dates)
{
  s = chron(date, "00:00:00", origin=orig)
  e = chron(date, "23:59:59", origin=orig)

  aeronet_day = window(aeronet, start=s, end=e)
}

Однако это дает мне предупреждение о том, что я использую разные источники для объекта aeronet zoo иs и e переменных, и он не выбирает никаких данных.

Есть ли лучший способ сделать это?Или способ это исправить?По сути, я хочу запустить цикл for, где в цикле я могу использовать код aeronet_day = window(aeronet, start=s, end=e) для создания объекта зоопарка, содержащего данные за один день (например, 1 мая 2005 года с 00:00:00 до 23:59:59.

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Предположим, у нас есть эти данные:

# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)

1) совокупность Функция R aggregate имеет метод зоопарка. Второй аргумент - это то, чем мы агрегируем. Если это функция, она применяется к индексу объекта зоопарка. например здесь мы вычисляем среднее значение для каждой даты:

z.ag <- aggregate(z, as.Date, mean)

Мы можем заменить mean более сложной функцией, если пожелаем.

2) сплит . Функция R split имеет метод зоопарка. Если мы действительно хотим разделить z по дате, то мы можем это сделать. Здесь z.split.list - список, каждый из компонентов которого содержит объект зоопарка на одну дату.

z.split.list <- split(z, as.Date(time(z)))

Теперь (a) sapply или (b) lapply по этому списку или (c) используйте следующее (заменив print(zc) любой обработкой, которая требуется). Здесь zc является компонентом списка, то есть это объект зоопарка, сформированный путем взятия определенной даты:

for(zc in z.split.list) print(zc)

Обратите внимание, что as.Date(time(z)) - это вектор с датами, соответствующими элементам z.

EDIT:

Различные незначительные разработки.

0 голосов
/ 06 декабря 2011

Если вы хотите что-то делать по дате, то у вас все в порядке.

Некоторые образцы aeronet данных.

last_date <- 1825
n <- 10000
aeronet <- data.frame(
  some.value = seq_len(n), 
  date = as.chron(
    runif(n, 0, last_date), 
    origin = orig,
    out.format = c(dates = "d/m/y", times = "h:m")
  )
)

Теперь вы можете разделить данные по дате с помощью split или применить функцию к каждой дате с помощью tapply или ddply из plyr (или использовать aggregate или что-то еще).

with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))

library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))
0 голосов
/ 06 декабря 2011

Я не знаком с зоопарком, но обычно я просто конвертирую дату в числовое значение, затем создаю последовательность и затем снова конвертирую. Например:

> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
  [1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
  [9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
 [17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
 [25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
 [33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
 [41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...
...