根据交易是否包含R中至少一部分时间范围来提取数据子集。

问题描述 投票:1回答:1

我有一个数据框架 df 其中包含不同的交易。每个事务都有一个开始日期和结束日期。这两个变量是 开始时间结束时间. 它们属于 POSIXct.举个例子,它们的样子如下 "2018-05-23 23:40:00""2018-06-24 00:10:00".其中约有13000笔交易。df 我想提取所有包含至少一点指定时间间隔的交易,如果不是全部的话。时间间隔或范围是20:00:00 - 8:00:00,所以基本上8 P.M =< interval < 8 A.M。

我正在尝试使用 dplyr 和功能 filter() 然而我的问题是我不知道如何写布尔表达式。到目前为止,我在代码中写的是这样的。

df %>% filter(hour(start_time) >= 20 | hour(start_time) < 8 |hour(end_time) >= 20 | hour(end_time) < 8 )

我想这可能会得到所有至少包含了该区间一部分的交易 但我又想到了可能在该区间之外开始和结束的交易 但它们的持续时间太长了,以至于包含了该区间的那些小时数 我想也许可以添加 | duration > 12 因为任何持续时间超过12小时的开始时间都会包含该时间间隔的一部分。但是,我觉得这段代码没有必要那么长,一定有一个更简单的方法,但是我不知道怎么做。

r dataframe time dplyr intervals
1个回答
0
投票

我将从一个样本数据框架开始,因为一个样本数据框架是由我自己设计的。df 问题中没有给出。

library(lubridate)
library(dplyr)

set.seed(69)
dates <- as.POSIXct("2020-04-01") + days(sample(30, 10, TRUE))
start_time <- dates + seconds(sample(86400, 10, TRUE))
end_time  <- start_time + seconds(sample(50000, 10, TRUE))
df <- data.frame(Transaction = LETTERS[1:10], start_time, end_time)

df
#>    Transaction          start_time            end_time
#> 1            A 2020-04-18 16:51:03 2020-04-19 00:05:54
#> 2            B 2020-04-28 21:32:10 2020-04-29 06:18:06
#> 3            C 2020-04-03 02:12:52 2020-04-03 06:11:20
#> 4            D 2020-04-17 19:15:43 2020-04-17 21:01:52
#> 5            E 2020-04-09 11:36:19 2020-04-09 19:01:14
#> 6            F 2020-04-14 20:51:25 2020-04-15 06:08:10
#> 7            G 2020-04-08 12:01:55 2020-04-09 01:45:53
#> 8            H 2020-04-16 01:43:38 2020-04-16 04:22:39
#> 9            I 2020-04-08 23:11:51 2020-04-09 09:04:26
#> 10           J 2020-04-07 12:28:08 2020-04-07 12:55:42

我们可以列举出比赛的可能性如下:

  1. 任何开始时间在08: 00之前或20: 00之后
  2. 任何停止时间在08:00之前或20:00之后。
  3. 停止时间和开始时间在不同的日期。

使用一点模块数学,我们可以把它写成。

df %>% filter((hour(start_time) + 12) %% 20 > 11 | 
              (hour(end_time) + 12) %% 20 > 11 | 
              date(start_time) != date(end_time))
#>   Transaction          start_time            end_time
#> 1           A 2020-04-18 16:51:03 2020-04-19 00:05:54
#> 2           B 2020-04-28 21:32:10 2020-04-29 06:18:06
#> 3           C 2020-04-03 02:12:52 2020-04-03 06:11:20
#> 4           D 2020-04-17 19:15:43 2020-04-17 21:01:52
#> 5           F 2020-04-14 20:51:25 2020-04-15 06:08:10
#> 6           G 2020-04-08 12:01:55 2020-04-09 01:45:53
#> 7           H 2020-04-16 01:43:38 2020-04-16 04:22:39
#> 8           I 2020-04-08 23:11:51 2020-04-09 09:04:26

你可以检查所有的时间至少有一部分在给定的范围内, 而被删除的两行则不在范围内。

© www.soinside.com 2019 - 2024. All rights reserved.