2015-04-23 1 views
2

Я начинаю с набора временных меток журнала и хочу создать набор неперекрывающихся периодов времени, чтобы я мог показывать соответствующие записи в каком-либо контексте.Как найти отдельные временные периоды контекста вокруг моментов в R?

Предполагая, что я список DateTimes в R:

times <- c("2015-03-10 19:13:35", 
      "2015-03-10 19:13:37", 
      "2015-03-10 19:15:20", 
      "2015-03-10 19:16:40", 
      "2015-03-10 19:16:45") 

Я хотел бы получить список временных периодов, охватывающих 10s обе стороны от этих дат, без наложений. Например:

[1] "2015-03-10 19:13:25" -- "2015-03-10 19:13:47" 
[2] "2015-03-10 19:15:10" -- "2015-03-10 19:15:30" 
[3] "2015-03-10 19:16:30" -- "2015-03-10 19:16:55" 
  • [1] Запускает 10s до того раза [1], и заканчивается через 10с после раз [2] (потому что они в пределах 10 секунд друг от друга)
  • [2] Это просто 10s каждая сторона раз [3], потому что не перекрывается с другими периодами
  • [3] Запуск 10s до того раза [4] и заканчивается 10s после того, как раз [5] (они вновь уже близко)

Я попытался использовать lubridate, я могу создать периоды времени (по общему признанию, легкую часть). Как объединить перекрывающиеся периоды?

intervals <- as.interval(new_difftime(second=20), ymd_hms(times) - 10) 

ответ

1

Вот как я бы подойти к этому с помощью базового R

times <- as.POSIXct(times) # Convert your times to POSIXct class 
Myfunc <- function(x) { 
         temp <- range(x) ; 
         c(min = temp[1] - 10, max = temp[2] + 10) 
} # Create a range function 
indx <- cumsum(c(0, diff(times)) > 10) # Create an index which separate the 
tapply(times, indx, Myfunc) # Run the whole thing 
# $`0` 
#      min      max 
# "2015-03-10 19:13:25 IST" "2015-03-10 19:13:47 IST" 
# 
# $`1` 
#      min      max 
# "2015-03-10 19:15:10 IST" "2015-03-10 19:15:30 IST" 
# 
# $`2` 
#      min      max 
# "2015-03-10 19:16:30 IST" "2015-03-10 19:16:55 IST" 

Или, если вы предпочитаете результат в более прочной структуры, я пошел бы с data.table (видимо aggregate не сохраняет POSIXct класс по каким-либо причинам)

df <- data.frame(times, indx) 
library(data.table) 
setDT(df)[, as.list(Myfunc(times)), by = indx] 
# indx     min     max 
# 1: 0 2015-03-10 19:13:25 2015-03-10 19:13:47 
# 2: 1 2015-03-10 19:15:10 2015-03-10 19:15:30 
# 3: 2 2015-03-10 19:16:30 2015-03-10 19:16:55 
+1

Спасибо, это очень помогло. –