Что такое эффективный способ для того, чтобы разделить и агрегировать интервалы от строк с меткой времени в кадре данных?

От кадра данных со строками с меткой времени (strptime результаты), каков лучший метод для агрегации статистики для интервалов?

Интервалы могли быть часом, днем, и т.д.

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

Спасибо за любые указатели!


Данные в качестве примера

Пять строк с метками времени, разделенными на 15-минутные интервалы, запускающиеся в 3:00.

Интервал 1

  • "13.01.2010 3:02:38 UTC"
  • "13.01.2010 3:08:14 UTC"
  • "13.01.2010 3:14:52 UTC"

Интервал 2

  • "13.01.2010 3:20:42 UTC"
  • "13.01.2010 3:22:19 UTC"

Заключение

Используя пакет временного ряда такой как xts должно быть решение; однако я не имел никакого успеха с помощью них и обветренный использование cut. Поскольку я в настоящее время только должен вывести гистограммы на печать со строками, сгруппированными интервалом, это было достаточно.

cut используется любил так:

interv <- function(x, start, period, num.intervals) {
  return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
5
задан Joshua Ulrich 16 March 2013 в 15:18
поделиться

3 ответа

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

6
ответ дан 13 December 2019 в 05:33
поделиться

Используйте пакет временных рядов . В пакете xts есть функции, специально разработанные для этого. Или посмотрите на функции aggregate и rollapply в пакете zoo.

В электронной книге rmetrics есть полезное обсуждение, включая сравнение производительности различных пакетов: https://www.rmetrics.org/files/freepdf/TimeSeriesFAQ.pdf

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

6
ответ дан 13 December 2019 в 05:33
поделиться

Это интересный вопрос; с распространением различных пакетов и методов временных рядов должен быть подход для объединения нерегулярных временных рядов, отличный от грубой силы, как предлагает ОП. Вот один из «высокоуровневых» способов получить интервалы, которые затем можно использовать для агрегата и др., Используя версию 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-минутных баров объема на тиковых данных для очень ликвидной акции.

0
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: