2010-03-14 3 views
5

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

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

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

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


Пример данные

Пяти строки с временными метками разделены на 15-минутные интервалы, начиная с 03:00.

Интервал 1

  • "2010-01-13 3:02:38 UTC"
  • "2010-01-13 3:08:14 UTC"
  • «2010-01 -13 3:14:52 UTC»

Интервал 2

  • "2010-01-13 3:20:42 UTC"
  • "2010-01-13 3:22:19 UTC"

Заключение

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

cut используется так понравилось:

interv <- function(x, start, period, num.intervals) { 
    return(cut(x, as.POSIXlt(start)+0:num.intervals*period)) 
} 
+0

Вы можете использовать значение по умолчанию для 'num.intervals' как' потолок ((max (x) -start)/period) '. Тогда вы уверены, что наибольшая временная метка будет в некоторый интервал. – Marek

ответ

6

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

+0

Спасибо, похоже, это немного меня пойдет по пути взлома простая агрегация ts. Я все еще держу это открытым, потому что думаю, что мы близки к хорошему решению с использованием 'xts' с нерегулярными, возможно, не уникальными отметками времени. – mattrepl

6

Используйте time series package. Пакет XTS имеет функции, разработанные специально, чтобы сделать это. Или посмотрите на функции агрегата и rollapply в пакете zoo.

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

Редактировать: Посмотрите на my answer to this question. В основном вам нужно усечь каждую временную метку на определенный интервал, а затем выполнить агрегацию с использованием этих новых усеченных временных меток в качестве вашего вектора группировки.

+0

Это выглядит многообещающим, спасибо! Я, возможно, не был ясен, хотя каждая строка имеет временную отметку, все строки, которые должны попадать в один и тот же интервал, будут иметь разные точные времена. Например, две метки времени, которые отличаются только на несколько минут, должны относиться к одному и тому же интервалу в 15 минут. Я обновил вопрос с примерами данных. – mattrepl

+0

@mattrepl: Начните с пакета 'zoo' и его виньет - как говорит Шейн, они сделаны для этой задачи. –

+0

Я пытаюсь использовать 'xts' сейчас. Я заметил, что в данных есть несколько повторяющихся временных меток (событий, происходящих одновременно), но я прочитал, что xts и zoo должны иметь возможность обрабатывать это в электронной книге часто задаваемых вопросов. В настоящее время я получаю сообщение об ошибке при попытке создать объект временного ряда с помощью 'xts':« order.by требует соответствующего объекта, основанного на времени ». Я пробовал POSIXct, timeDate и т. Д. Например, использование вектора временных меток POSIXct вызовет мне эту ошибку. Есть предположения? Я могу предоставить небольшой тестовый пример, если проблема не очевидна. – mattrepl

0

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

, который теперь вы можете добавляемый к кадру данных и совокупности.

Акустическая система с круговым движением выше (от символа до времени), является немного неудачной, поэтому, если есть более чистые решения для бинарного нерегулярного времени с использованием xts или любого другого пакета timeSeries, я бы хотел услышать о них тоже! ..

Мне также интересно узнать, какой был бы наиболее эффективный подход для биннинга больших высокочастотных нерегулярных временных рядов, например создавая 1-минутную шкалу объема данных тика для очень жидкого запаса.