如何使用R检测系列数据中的间隙

时间:2015-05-28 20:16:21

标签: r

我有一个设备可以将定期(大约每5分钟)行插入状态表。每行都被视为状态事件,并带有时间戳。我需要检测两个状态事件何时发生超过10分钟。

虽然我可以使用循环解决方案但它看起来并不优雅,我正在寻找另一个答案。数据库中的表可以简化为:

12:01:00,状态,确定
12:06:31,状态,确定
12:12:02,状态,确定
13:15:43,状态,好的 13,20:33,状态,好的

所以我想检测第3和第4状态行之间有1:03:41的间隙。毋庸置疑,我有很多数据需要处理。

2 个答案:

答案 0 :(得分:3)

如果你正在处理POSIXct格式的时间戳数据,你可以做简单的减法来获得时差。

因为R是矢量化的,所以不需要循环 - 它只是一个矢量减去另一个

然后很容易测试差距是否超过某个阈值。

# here's a data frame with a bunch of time stamps
my_dat <- data.frame(time=Sys.time() + sort(runif(10, 100, 600)))

# Take rows 1 to n-1 and subtract rows 2 to n:
my_dat$gap <- c(NA, with(my_dat, time[-1] - time[-nrow(my_dat)]))

# now, how often was the gap more than some amount of time?
gap_threshold <- 30 # let's say, 30 seconds
my_dat$over_thresh <- my_dat$gap > gap_threshold
my_dat

# result: timestamp, difference from prior row in seconds, threshold test result
# > my_dat
#                   time       gap over_thresh
# 1  2015-05-28 16:28:05        NA          NA
# 2  2015-05-28 16:28:46 40.852095        TRUE
# 3  2015-05-28 16:29:35 49.060379        TRUE
# 4  2015-05-28 16:29:55 20.290983       FALSE
# 5  2015-05-28 16:30:02  6.580322       FALSE
# 6  2015-05-28 16:30:34 32.039323        TRUE
# 7  2015-05-28 16:30:58 24.601907       FALSE
# 8  2015-05-28 16:31:16 17.761954       FALSE
# 9  2015-05-28 16:31:51 34.794329        TRUE
# 10 2015-05-28 16:32:35 44.213900        TRUE

答案 1 :(得分:0)

使用chron "times"类,我们可以使用diff比较相邻时间,并将其与10分钟进行比较:

library(chron)

Times <- times(DF[[1]])
which(c(FALSE, diff(Times) > times("00:10:00")))
## [1] 4

所以第4点是在前一点(第3点)之后超过10分钟。

注意:我们使用了这个输入:

Lines <- "12:01:00, status, ok
12:06:31, status, ok
12:12:02, status, ok
13:15:43, status, ok
13:20:33, status, ok"
DF <- read.table(text = Lines, sep = ",", as.is = TRUE)