如果时间数据点太靠近先前的数据点,则将其删除

时间:2018-10-15 11:25:06

标签: r

我有一个具有以下时间序列的数据集:

20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00

我想做的是,如果在同一分钟,几小时或同一天内已经记录了一个数据点,则将其删除。要获得此结果(仅需要第一个数据点,而不是平均值):

20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:43:05 +00:00

关于如何在R中执行此操作的任何想法?我最初考虑过循环一个检查每条记录的语句,但是由于它是一个大数据集,所以我不知道这样做是否有效。

3 个答案:

答案 0 :(得分:1)

您可以创建一个新变量,其中将包括日期和小时/分钟。在这种情况下,我将其转换为POSIXlt类型并提取了相关字段。使用duplicated,我排除了在数据集中出现多次的任何事物。

xy <- read.table(text = "20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00", header = FALSE)
xy

xy$datetime <- paste(xy$V1, xy$V2)
xy$datetime <- as.POSIXlt(xy$datetime, format = c("%d-%m-%Y %H:%M:%S"))
xy$to_hm <- format(xy$datetime, format = "%d-%m-%Y %H:%M")
xy[!duplicated(xy$to_hm), ]

          V1       V2     V3            datetime            to_hm
1 20-05-2017 06:14:24 +00:00 2017-05-20 06:14:24 20-05-2017 06:14
2 20-05-2017 07:41:13 +00:00 2017-05-20 07:41:13 20-05-2017 07:41
4 20-05-2017 07:42:13 +00:00 2017-05-20 07:42:13 20-05-2017 07:42
8 20-05-2017 07:43:05 +00:00 2017-05-20 07:43:05 20-05-2017 07:43

答案 1 :(得分:1)

据我了解...

library(lubridate)
library(data.table)
data<-data.table(read.table(col.names = "time1",  text = "20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00",sep=","))

data[,time:=dmy_hms(time1)]
data[,time_trunc:=floor_date(time,"minutes")]
data[,time_rank_inside_minute:=frank(time,ties.method = "random"),by=time_trunc]
data<-data[time_rank_inside_minute==1]

答案 2 :(得分:0)

require('lubridate')
require('tibble')
require('quantmod')

dfm <- tibble(index = dmy_hms(c('20-05-2017 06:14:24 +00:00', '20-05-2017 07:41:13 +00:00', '20-05-2017 07:41:14 +00:00', '20-05-2017 07:42:13 +00:00', '20-05-2017 07:42:14 +00:00', '20-05-2017 07:42:20 +00:00', '20-05-2017 07:42:36 +00:00', '20-05-2017 07:43:05 +00:00')))

> dfm %>% mutate(index = round_date(index, 'minute'))
# A tibble: 8 x 1
  index              
  <dttm>             
1 2017-05-20 06:14:00
2 2017-05-20 07:41:00
3 2017-05-20 07:41:00
4 2017-05-20 07:42:00
5 2017-05-20 07:42:00
6 2017-05-20 07:42:00
7 2017-05-20 07:43:00
8 2017-05-20 07:43:00
> dfm %>% mutate(index = round_date(index, 'minute')) %>% unique
# A tibble: 4 x 1
  index              
  <dttm>             
1 2017-05-20 06:14:00
2 2017-05-20 07:41:00
3 2017-05-20 07:42:00
4 2017-05-20 07:43:00