От кадра данных со строками с меткой времени (strptime результаты), каков лучший метод для агрегации статистики для интервалов?
Интервалы могли быть часом, днем, и т.д.
Существует aggregate
функция, но это не помогает с присвоением каждой строки к интервалу. Я - планирование добавления столбца к кадру данных, который обозначает интервал и использование это с aggregate
, но если бы существует лучшее решение, было бы замечательно услышать его.
Спасибо за любые указатели!
Данные в качестве примера
Пять строк с метками времени, разделенными на 15-минутные интервалы, запускающиеся в 3:00.
Интервал 1
Интервал 2
Заключение
Используя пакет временного ряда такой как xts
должно быть решение; однако я не имел никакого успеха с помощью них и обветренный использование cut
. Поскольку я в настоящее время только должен вывести гистограммы на печать со строками, сгруппированными интервалом, это было достаточно.
cut
используется любил так:
interv <- function(x, start, period, num.intervals) {
return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
Стандартными функциями для разделения векторов являются cut
и findInterval
:
v <- as.POSIXct(c(
"2010-01-13 03:02:38 UTC",
"2010-01-13 03:08:14 UTC",
"2010-01-13 03:14:52 UTC",
"2010-01-13 03:20:42 UTC",
"2010-01-13 03:22:19 UTC"
))
# Your function return list:
interv(v, as.POSIXlt("2010-01-13 03:00:00 UTC"), 900)
# [[1]]
# [1] "2010-01-13 03:00:00"
# [[2]]
# [1] "2010-01-13 03:00:00"
# [[3]]
# [1] "2010-01-13 03:00:00"
# [[4]]
# [1] "2010-01-13 03:15:00 CET"
# [[5]]
# [1] "2010-01-13 03:15:00 CET"
# cut returns factor, you must provide proper breaks:
cut(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 2010-01-13 03:00:00 2010-01-13 03:00:00 2010-01-13 03:00:00
# [4] 2010-01-13 03:15:00 2010-01-13 03:15:00
# Levels: 2010-01-13 03:00:00 2010-01-13 03:15:00
# findInterval returns vector of interval id (breaks like in cut)
findInterval(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 1 1 1 2 2
Для записи: cut
имеет метод для типа POSIXt
, но, к сожалению, нет способа предоставить аргумент start
, эффект следующий:
cut(v,"15 min")
# [1] 2010-01-13 03:02:00 2010-01-13 03:02:00 2010-01-13 03:02:00
# [4] 2010-01-13 03:17:00 2010-01-13 03:17:00
# Levels: 2010-01-13 03:02:00 2010-01-13 03:17:00
Как вы видите, он начинается в 03:02: 00. Вы можете испортить метки выходного коэффициента (преобразовать метки во время, как-то округлить и преобразовать обратно в символ).
Используйте пакет временных рядов . В пакете xts есть функции, специально разработанные для этого. Или посмотрите на функции aggregate и rollapply в пакете zoo.
В электронной книге rmetrics есть полезное обсуждение, включая сравнение производительности различных пакетов: https://www.rmetrics.org/files/freepdf/TimeSeriesFAQ.pdf
Изменить : см. мой ответ на этот вопрос . По сути, вам нужно усечь каждую метку времени до определенного интервала, а затем выполнить агрегирование, используя эти новые усеченные метки времени в качестве вектора группировки.
Это интересный вопрос; с распространением различных пакетов и методов временных рядов должен быть подход для объединения нерегулярных временных рядов, отличный от грубой силы, как предлагает ОП. Вот один из «высокоуровневых» способов получить интервалы, которые затем можно использовать для агрегата
и др., Используя версию cut
, определенную для chron
объектов. .
require(chron)
require(timeSeries)
my.times <- "
2010-01-13 03:02:38 UTC
2010-01-13 03:08:14 UTC
2010-01-13 03:14:52 UTC
2010-01-13 03:20:42 UTC
2010-01-13 03:22:19 UTC
"
time.df <- read.delim(textConnection(my.times),header=FALSE,sep="\n",strip.white=FALSE)
time.seq <- seq(trunc(timeDate(time.df[1,1]),units="hours"),by=15*60,length=nrow(time.df))
intervals <- as.numeric(cut(as.chron(as.character(time.df$V1)),breaks=as.chron(as.character(time.seq))))
Вы получаете
intervals
[1] 1 1 1 2 2
, который теперь можно добавить к фрейму данных и агрегировать.
Приведенная выше акробатика приведения (от символа к timeDate к символу к chron) немного неудачна, поэтому, если есть более чистые решения для объединения нерегулярных данных времени с помощью xts или любого другого пакета timeSeries, я бы хотел услышать о их тоже! ..
Мне также любопытно узнать, какой подход был бы наиболее эффективным для объединения больших высокочастотных нерегулярных временных рядов, например создание 1-минутных баров объема на тиковых данных для очень ликвидной акции.