r - 如何计算条件匹配之前的时间段
问题描述
我需要计算一个连续日期的时间,直到两个连续日期之间的时间差大于 13 秒。
例如,在使用下面显示的代码创建的数据框中,列 test 具有日期之间的时间差。我需要的是测试> 13秒的行之间的时间事件。
# Create a vector of dates with a random time difference in seconds between records
dates <- seq(as.POSIXct("2020-01-01 00:00:02"), as.POSIXct("2020-01-02 00:00:02"), by = "2 sec")
dates <- dates + sample(15, length(dates), replace = T)
# Create a data.frame
data <- data.frame(id = 1:length(dates), dates = dates)
# Create a test field with the time difference between each date and the next
data$test <- c(diff(data$dates, lag = 1), 0)
# Delete the zero and negative time
data <- data[data$test > 0, ]
head(data)
我想要的是这样的:
解决方案
为了达到您想要的结果,我们需要定义观察的“块”。每个块在test
大于 13的地方被分割。
我们开始识别split_point
,然后使用rle
函数我们可以为每个块分配一个 ID。然后我们可以过滤掉split_point
,并总结剩余的块。一次是秒的总和,然后是事件日期的最小值。
split_point <- data$test <=13
# Find continuous blocks
block_str <- rle(split_point)
# Create block IDs
data$block <- rep(seq_along(block_str$lengths), block_str$lengths)
data <- data[split_point, ] # Remove split points
# Summarize
final_df <- aggregate(test ~ block, data = data, FUN = sum)
dtevent <- aggregate(dates ~ block, data= data, FUN=min)
# Join the two summaries
final_df$DatetimeEvent <- dtevent$dates
head(final_df)
#> block test DatetimeEvent
#> 1 1 101 2020-01-01 00:00:09
#> 2 3 105 2020-01-01 00:01:11
#> 3 5 277 2020-01-01 00:02:26
#> 4 7 46 2020-01-01 00:04:58
#> 5 9 27 2020-01-01 00:05:30
#> 6 11 194 2020-01-01 00:05:44
由reprex 包(v0.3.0)于 2020 年 4 月 2 日创建
dplyr
为方便起见使用:
library(dplyr)
final_df <- data %>%
mutate(split_point = test <= 13,
block = with(rle(split_point), rep(seq_along(lengths), lengths))) %>%
group_by(block) %>%
filter(split_point) %>%
summarise(DateTimeEvent = min(dates), TotalTime = sum(test))
final_df
#> # A tibble: 1,110 x 3
#> block DateTimeEvent TotalTime
#> <int> <dttm> <drtn>
#> 1 1 2020-01-01 00:00:06 260 secs
#> 2 3 2020-01-01 00:02:28 170 secs
#> 3 5 2020-01-01 00:04:11 528 secs
#> 4 7 2020-01-01 00:09:07 89 secs
#> 5 9 2020-01-01 00:10:07 37 secs
#> 6 11 2020-01-01 00:10:39 135 secs
#> 7 13 2020-01-01 00:11:56 50 secs
#> 8 15 2020-01-01 00:12:32 124 secs
#> 9 17 2020-01-01 00:13:52 98 secs
#> 10 19 2020-01-01 00:14:47 83 secs
#> # … with 1,100 more rows
由reprex 包(v0.3.0)于 2020 年 4 月 2 日创建
(结果不同,因为reprex
每次都重新创建数据)
推荐阅读
- php - php - How can I miss out parameters when calling a function?
- vba - VBA:组织非矩形范围(编辑)
- ikvm - GlyphVector.getoutline() 永远不会返回
- html - 使用 Python-Flask 使用 postgresql 数据库中的数据填充 html 下拉列表
- typescript - 在 Typescript 中,可以使用泛型添加属性键吗?
- api - 浮动日期之间如何查询?
- php - 为输入发送 cookie 并发送到 mysql
- phoenix-framework - Phoenix 1.4.0-dev 生成的通道测试失败并出现编译错误
- xml - 使用 xslt 从 xml 数据创建数组数组作为 csv 中的一个字段时,添加逗号作为分隔符
- android - 保持相互呼叫服务/广播