2016-09-19 6 views
1

У меня есть данные временного ряда в формате zoo, а еще два кадра данных переменных в формате POSIXct записывают 7 пар смотрящего и завершающего времени, которые представляют диапазоны времени, которые следует удалить , Рисунок ниже иллюстрирует вопросы графически. Выделенные регионы - это область, которую я уже идентифицировал и, как ожидается, будет удален.Как удалить определенный период времени в формате зоопарка

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

Положите его простым, любым способом удалить несколько периодов в временном ряду, например, используя знак минуса (-) для удаления столбцов или строк в кадре данных?

Illustration

Дополнительный

Идентифицированный период в кадре данных, как показано ниже (в формате POSIXct) Данные

Временные ряды в стандартном формате зоопарке

enter image description here

+1

Можете ли вы предоставить небольшой пример (гипотетические данные)? –

+0

См. [Mcve], как обеспечить воспроизводимый пример. В этом случае я дал один ответ. –

+0

Большое спасибо @ G.Grothendieck, я посмотрю и буду следовать инструкциям в будущем. –

ответ

3

В hort, no.

Напомним, что POSIXct действительно хранит свою информацию как double. Ваше желаемое использование оператора -, аналогично тому, что мы делаем для векторов , индексы действительно нацелены на integer индексы, в которых можно протестировать идеальное равенство.

Здесь у вас есть только неравенства. Таким образом, вы можете что-то вроде этого (где я составляю дату, как вы ничего воспроизводимого не предусмотрен):

R> set.seed(42) 
R> N <- 1000 
R> Z <- zoo(cumsum(rnorm(N)), order.by=Sys.time() + seq(0,by=3*60*60,length=N)) 
R> summary(Z) 
    Index        Z   
Min. :2016-09-19 06:36:25.31 Min. :-49.91 
1st Qu.:2016-10-20 11:51:25.31 1st Qu.:-27.43 
Median :2016-11-20 16:06:25.31 Median :-10.71 
Mean :2016-11-20 16:06:25.31 Mean :-15.89 
3rd Qu.:2016-12-21 21:21:25.31 3rd Qu.: -6.30 
Max. :2017-01-22 02:36:25.31 Max. : 9.06 

Теперь, когда у нас есть некоторые данные, давай просто использовать указательную логику, чтобы исключить данный период - который мы разграничить с помощью ISOdatetime:

R> newZ <- Z[ ! (index(Z) >= ISOdatetime(2016,11,1,0,0,0) \ 
       & index(Z) <= ISOdatetime(2016,11,30,23,59,59)), ] 
R> 

мы можем посмотреть на данные, и увидите, что она исключала желаемый период, как мы нацелены на:

R> summary(newZ) 
    Index        newZ  
Min. :2016-09-19 06:36:25.31 Min. :-49.91 
1st Qu.:2016-10-12 23:06:25.31 1st Qu.:-33.73 
Median :2016-12-05 17:36:25.31 Median :-12.65 
Mean :2016-11-22 03:49:42.16 Mean :-17.74 
3rd Qu.:2016-12-29 10:06:25.31 3rd Qu.: -5.56 
Max. :2017-01-22 02:36:25.31 Max. : 9.06 
R> table(as.POSIXlt(index(newZ))$mon) # no November as expected 

    0 8 9 11 
169 94 248 248 
R> 

Вы можете выглядеть t xts индексирование.

2

Если у вас есть начальные и конечные показатели подмножеств известных, вы можете использовать следующую команду для каждого из подмножеств, полагая х представляет данные в формате зоопарка:

x[start.index:end.index] <- NA 
na.omit(x) 

Для того чтобы найти индекс времени POSIXct в данных в формате зоопарка, вы можете использовать что-то вроде следующего:

x 
2012-04-09 05:03:00 2012-04-09 05:04:00 2012-04-09 05:05:39 2012-04-09 05:09:00 2012-04-09 05:10:00 
        2     4     3     6     1 

which(index(x) >= '2012-04-09 05:09:00' & index(x) <= '2012-04-09 05:10:00') 
4 5 
0

Вдохновленный ответ sandipan, я написал небольшую функцию, ниже которой решить эту проблему. Где это временной ряд в zoo, а hl.period - это 2 кадра данных данных в формате POSIXct, как показано в вопросе. Однако я считаю, что должен быть более элегантный способ решить эту проблему.

Также спасибо за вклад Дирка. Ваш подход выглядит многообещающим. Но поскольку я новичок в анализе временных рядов, мне нужно сделать домашнее задание, чтобы понять ваш подход.

del_periods<-function(dat,hl.period) 
{ 
    for (i in 1:nrow(hl.period)) 
    { 
     window(dat,start=hl.period[i,1],end=hl.period[i,2])<-NA 
     dat<-na.omit(dat) 
    } 
    return(dat) 
} 
0

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

1) findInterval зоопарк индексы могут быть логичными так что этот код работает, используя логическое условие с findInterval, где z является вход POSIXct серии зоопарка., st является POSIXct вектора начинается и en является соответствующей POSIXct вектором концов. Приведенный ниже код формирует c(st[1], en[1] + .001, st[2], en[2] + .001, ...) так, чтобы четные интервалы отображали диапазоны, которые нужно сохранить и нечетные, чтобы исключить. Это предполагает, что интервалы упорядочены и неперекрываются так, что st[1] < en[1] < st[2] < en[2] < ... Это похоже на вопрос в вопросе.

z[ findInterval(index(z), c(rbind(st, en + .001))) %% 2 == 0 ] 

Обратите внимание, что если длина st и en каждый равен 1, то это упрощает для:

z[ findInterval(index(z), c(st, en + .001)) != 1 ] 

2) матч Если st и en значения относятся к числу index(z) значений мы могли бы попеременно использование match. например, это было бы в случае начала и конца, указанных в вопросе, если z были часовыми рядами. Это использует тот факт, что z[-(3:4)] работает, чтобы исключить элементы 3 и 4, скажем, из серии зоопарков z. Приведенный ниже код преобразует значения POSIXct в индексы среди 1, 2, 3, ..., length (z) и исключает использование минус.

z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ] 

Обратите внимание, что если длина st и en каждый равен 1, то это упрощает просто:

z[ - seq(match(st, index(z)), match(en, index(z)) ] 

Пример (2)

Например, попробовать с ними входы:

library(zoo) 

tt <- seq(as.POSIXct("2011-01-01 00:00:00"), as.POSIXct("2011-01-04 23:00:00"), by="hour") 
z <- zoo(seq_along(tt), tt) 

st <- as.POSIXct(c("2011-01-02 13:00:00", "2011-01-04 15:00:00")) 
en <- as.POSIXct(c("2011-01-02 14:00:00", "2011-01-04 17:00:00")) 

Теперь мы можем запустить это.

z0 <- z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ] 
plot(z0, type = "p", pch = 20) 

Обратите внимание на две исключенные области на графике ниже.

screenshot

 Смежные вопросы

  • Нет связанных вопросов^_^