簡體   English   中英

如何計算條件匹配之前的時間段

[英]How to calculate a time period until a condition is matched

我需要計算連續日期的時間,直到兩個連續日期之間的時間差大於 13 秒。

例如,在使用下面顯示的代碼創建的數據框中,列測試具有日期之間的時間差。 我需要的是測試 > 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每次都重新創建數據)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM