Как сохранить только события с разницей во времени R менее 3 минут - PullRequest
0 голосов
/ 09 мая 2018

У меня есть большой набор данных, в котором у каждой строки есть метка времени, поэтому у 400 тыс. Строк и у каждого есть время события. То, что я хотел бы сделать, это оставить только те, которые имеют разницу во времени менее 3 минут (конечно, я хотел бы изменить этот параметр позже).

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

     TIME_STAMP             PREV_TIME_STAMP      Unique ID 
06-27-2021 07:07:22       06-27-2021 06:30:00         1 
06-27-2021 04:38:55       06-27-2021 04:21:31         1 
06-27-2021 05:05:26       06-27-2021 02:55:00         1 
06-27-2021 14:32:39       06-27-2021 12:30:00         1 
06-27-2021 14:42:13       06-27-2021 14:32:39         1 
06-27-2021 15:18:05       06-27-2021 15:11:00         2 
06-27-2021 15:19:05       06-27-2021 15:18:05         2 
06-27-2021 12:31:37       06-27-2021 12:30:00         2 
06-27-2021 12:35:05       06-27-2021 12:30:00         2

Я кодирую в R.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Сначала вы должны изменить столбцы как объект даты и времени (POSIXct). Тогда простая разница найдет, какой ряд оставить, а какой выбросить:

df$TIME_STAMP <- as.POSIXct(df$TIME_STAMP, format = '%m-%d-%Y %H:%M:%S')
df$PREV_TIME_STAMP <- as.POSIXct(df$PREV_TIME_STAMP, format = '%m-%d-%Y %H:%M:%S')

Или используя пакет anytime

df$TIME_STAMP <- anytime::anytime(df$TIME_STAMP)
df$PREV_TIME_STAMP <- anytime::anytime(df$PREV_TIME_STAMP)

К счастью, разница во времени указывается в минутах

df[df$TIME_STAMP - df$PREV_TIME_STAMP > 3,]
#>            TIME_STAMP     PREV_TIME_STAMP Unique_ID
#> 1 2021-06-27 07:07:22 2021-06-27 06:30:00         1
#> 2 2021-06-27 04:38:55 2021-06-27 04:21:31         1
#> 3 2021-06-27 05:05:26 2021-06-27 02:55:00         1
#> 4 2021-06-27 14:32:39 2021-06-27 12:30:00         1
#> 5 2021-06-27 14:42:13 2021-06-27 14:32:39         1
#> 6 2021-06-27 15:18:05 2021-06-27 15:11:00         2
#> 9 2021-06-27 12:35:05 2021-06-27 12:30:00         2

С dplyr:

library(dplyr)

df %>% 
  mutate_at(vars(-Unique_ID), ~as.POSIXct(., format = '%m-%d-%Y %H:%M:%S')) %>% 
  filter(TIME_STAMP - PREV_TIME_STAMP > 3)
#>            TIME_STAMP     PREV_TIME_STAMP Unique_ID
#> 1 2021-06-27 07:07:22 2021-06-27 06:30:00         1
#> 2 2021-06-27 04:38:55 2021-06-27 04:21:31         1
#> 3 2021-06-27 05:05:26 2021-06-27 02:55:00         1
#> 4 2021-06-27 14:32:39 2021-06-27 12:30:00         1
#> 5 2021-06-27 14:42:13 2021-06-27 14:32:39         1
#> 6 2021-06-27 15:18:05 2021-06-27 15:11:00         2
#> 7 2021-06-27 12:35:05 2021-06-27 12:30:00         2

Данные:

df <- read.table(text = 'TIME_STAMP          PREV_TIME_STAMP      Unique_ID 
"06-27-2021 07:07:22" "06-27-2021 06:30:00"         1 
"06-27-2021 04:38:55" "06-27-2021 04:21:31"         1 
"06-27-2021 05:05:26" "06-27-2021 02:55:00"         1 
"06-27-2021 14:32:39" "06-27-2021 12:30:00"        1 
"06-27-2021 14:42:13" "06-27-2021 14:32:39"         1 
"06-27-2021 15:18:05" "06-27-2021 15:11:00"         2 
"06-27-2021 15:19:05" "06-27-2021 15:18:05"         2 
"06-27-2021 12:31:37" "06-27-2021 12:30:00"         2 
"06-27-2021 12:35:05" "06-27-2021 12:30:00"         2', header = T)
0 голосов
/ 09 мая 2018

Не уверен, что если я вас правильно интерпретирую, вы можете преобразовать отметку времени в класс POSIXct, затем добавить 3 минуты в PREV_TIME_STAMP и отфильтровать для этих TIME_STAMP более 3 минут после PREV_TIME_STAMP

DT[TIME_STAMP >= PREV_TIME_STAMP + 3*60]

или используя difftime

DT[difftime(TIME_STAMP, PREV_TIME_STAMP, units="mins") > 3]

выход:

#             TIME_STAMP     PREV_TIME_STAMP UniqueID
# 1: 2021-06-27 07:07:22 2021-06-27 06:30:00        1
# 2: 2021-06-27 04:38:55 2021-06-27 04:21:31        1
# 3: 2021-06-27 05:05:26 2021-06-27 02:55:00        1
# 4: 2021-06-27 14:32:39 2021-06-27 12:30:00        1
# 5: 2021-06-27 14:42:13 2021-06-27 14:32:39        1
# 6: 2021-06-27 15:18:05 2021-06-27 15:11:00        2
# 7: 2021-06-27 12:35:05 2021-06-27 12:30:00        2

данные:

library(data.table)
DT <- fread("TIME_STAMP,PREV_TIME_STAMP,UniqueID 
06-27-2021 07:07:22,06-27-2021 06:30:00,1 
06-27-2021 04:38:55,06-27-2021 04:21:31,1 
06-27-2021 05:05:26,06-27-2021 02:55:00,1 
06-27-2021 14:32:39,06-27-2021 12:30:00,1 
06-27-2021 14:42:13,06-27-2021 14:32:39,1 
06-27-2021 15:18:05,06-27-2021 15:11:00,2 
06-27-2021 15:19:05,06-27-2021 15:18:05,2 
06-27-2021 12:31:37,06-27-2021 12:30:00,2 
06-27-2021 12:35:05,06-27-2021 12:30:00,2")[, ':=' (
        TIME_STAMP = as.POSIXct(TIME_STAMP, format="%m-%d-%Y %H:%M:%S"),
        PREV_TIME_STAMP = as.POSIXct(PREV_TIME_STAMP, format="%m-%d-%Y %H:%M:%S")  
    )]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...