我有一个数据框架 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小时的开始时间都会包含该时间间隔的一部分。但是,我觉得这段代码没有必要那么长,一定有一个更简单的方法,但是我不知道怎么做。
我将从一个样本数据框架开始,因为一个样本数据框架是由我自己设计的。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
我们可以列举出比赛的可能性如下:
使用一点模块数学,我们可以把它写成。
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
你可以检查所有的时间至少有一部分在给定的范围内, 而被删除的两行则不在范围内。