Подмножество POSIXct времени на нечетные или четные секунды


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

Вы можете скачать небольшую часть моих данныхздесь (100 строк).

Первые 6 строк выглядят так:

            Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14
1 2013-04-01 00:00:00   0   1   1   1   1   0   1   1   1   1   0   1   0   1
2 2013-04-01 00:00:01   0   1   1   1   1   0   1   1   1   1   0   1   0   1
3 2013-04-01 00:00:02   0   1   1   1   1   0   1   1   1   1   0   1   0   1
4 2013-04-01 00:00:03   0   1   1   1   1   0   1   1   1   1   0   1   0   1
5 2013-04-01 00:00:04   0   1   1   1   1   0   1   1   1   1   0   1   0   1
6 2013-04-01 00:00:05   0   1   1   1   1   0   1   1   1   1   0   1   0   1

И я хотел бы, чтобы это выглядело так:

            Timestamp C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14
1 2013-04-01 00:00:00   0   1   1   1   1   0   1   1   1   1   0   1   0   1
2 2013-04-01 00:00:02   0   1   1   1   1   0   1   1   1   1   0   1   0   1
3 2013-04-01 00:00:04   0   1   1   1   1   0   1   1   1   1   0   1   0   1
4 2013-04-01 00:00:06   0   1   1   1   1   0   1   1   1   1   0   1   0   1
5 2013-04-01 00:00:08   0   1   1   1   1   0   1   1   1   1   0   1   0   1
6 2013-04-01 00:00:10   0   1   1   1   1   0   1   1   1   1   0   1   0   1

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

Спасибо!

Примечание: переменная Timestamp уже отформатирована в POSIXct.

4 4

4 ответа:

Без использования какого-либо внешнего пакета, вы могли бы сделать (для четных)

res =  df[(as.numeric(substr(df$Timestamp, 18, 19)) %% 2) == 0,]

Для тестирования я использовал небольшое подмножество вашего фрейма данных:

df = data.frame(Timestamp = c("2013-04-01 00:00:00", "2013-04-01 00:00:01", "2013-04-01 00:00:02", "2013-04-01 00:00:03", "2013-04-01 00:00:04"), C01 = rep(0,5), C02 = rep(1,5))
df$Timestamp = as.POSIXct(df$Timestamp)

Вот что вы получаете (для четных):

#> res
#            Timestamp C01 C02
#1 2013-04-01 00:00:00   0   1
#3 2013-04-01 00:00:02   0   1
#5 2013-04-01 00:00:04   0   1

Для нечетных применяется та же логика, заменяя ==0 на ==1

Я добавляю ответ, потому что, хотя все ответы хороши, ни один из них не признал тот факт, что объект POSIXct, когда он преобразуется в целые числа, на самом деле выражается в секундах (с 1 января 1970 года), поэтому на самом деле следующее работает также (но не будет, если вы пытаетесь выбрать нечетные и четные минуты, часы,...):

a <- seq(as.POSIXct("2013-04-01 00:00:00"),as.POSIXct("2013-04-01 01:00:00"),by="secs")
a[as.integer(a)%%2==0]
library(lubridate)

foo <- seq(as.POSIXct("2013-01-10"), as.POSIXct("2013-01-11"), by = "secs")

secs <- second(foo)

even <- foo[secs %% 2 == 0]
odd <- foo[secs %% 2 == 1]

Ваша ссылка для загрузки не работала для меня, поэтому я не использовал ваши данные, но вы должны быть в состоянии подмножество вашего data.frame таким же образом.

A base альтернатива:

tt <- c(Sys.time(), Sys.time() + 1)
tt
# [1] "2013-10-29 19:43:26 CET" "2013-10-29 19:43:27 CET"

tt[as.numeric(format(tt, "%S")) %% 2 == 0]
# [1] "2013-10-29 19:43:26 CET"

Обновление с более быстрой альтернативой благодаря @Roland

tt[round(as.POSIXlt(tt)$sec) %% 2 == 0]