如何解决使用日期时间向量过滤数据帧
我正在尝试使用日期时间对象(POSIXct)的向量过滤数据帧。第一个向量包含开始时间,第二个向量包含结束时间。我只想返回属于日期时间对之一的值,即介于一对开始时间和结束时间之间的值。
以下是一些示例数据:
dat <- structure(list(timestamp = structure(c(1604386800,1604386801,1604386802,1604386803,1604386804,1604386805,1604473200,1604473201,1604473202,1604473203,1604473204,1604473205,1604386800,1604586800,1604586801,1604586802,1604586803,1604586804,1604586805,1604586805),class = c("POSIXct","POSIXt"),tzone = "UTC"),process_time = c(0L,1L,2L,3L,4L,5L,0L,5L),process_name = c("A","A","B","C","A")),class = "data.frame",row.names = c(NA,-36L))
这是到目前为止我得到的:
library(lubridate)
library(dplyr)
start_time <- ymd_hms(c("2020-11-03 07:00:01","2020-11-04 07:00:01","2020-11-05 14:33:21"))
end_time <- ymd_hms(c("2020-11-03 07:00:04","2020-11-04 07:00:04","2020-11-05 14:33:24"))
filtered_dat <- dat %>%
group_by(date(timestamp),process_name) %>%
filter(timestamp >= start_time & timestamp <= end_time)
我要寻找的是针对每个日期和流程类型过滤掉的第一个和最后一个值。看起来像这样:
timestamp | process_time | process_name
------------------------------------------------------------
2020-11-03 07:00:01 | 1 | A
2020-11-03 07:00:02 | 2 | A
2020-11-03 07:00:03 | 3 | A
2020-11-03 07:00:04 | 4 | A
2020-11-04 07:00:01 | 1 | A
2020-11-04 07:00:02 | 2 | A
2020-11-04 07:00:03 | 3 | A
2020-11-04 07:00:04 | 4 | A
2020-11-03 07:00:01 | 1 | B
2020-11-03 07:00:02 | 2 | B
2020-11-03 07:00:03 | 3 | B
2020-11-03 07:00:04 | 4 | B
... ... ...
#spacing added for clarity
似乎正在发生的是开始时间向量和结束时间向量正在回收。因此,它将数据帧的第一行与开始和结束时间向量中的第一项进行比较,然后将第二行与开始和结束时间向量中的第二项进行比较,依此类推。每隔几行都会得到一个匹配项。
我需要做的是,在移至数据框的下一行之前,将数据框的每一行与所有对进行比较。似乎purrr
是这里的答案。
解决方法
为此,我们可以使用lubridate
来阅读intervals
。
如果有多个时间间隔,则文档建议我们将其变成一个列表:
intervals <- list(interval(start_time,end_time))
假设我们要检查某个日期是否在这些间隔内,我们可以使用%within%
函数:
ts <- ymd_hms(2020-11-03 07:00:02)
ts %within% intervals
结果:
> ts %within% intervals
[1] TRUE FALSE FALSE
或者我们要同时检查所有间隔:
> any(ts %within% intervals)
[1] TRUE
将此应用于您的数据框:
dat <- dat %>%
rowwise() %>%
mutate(within = any(timestamp %within% intervals))
之后,您可以使用简单的过滤。
,您可以使用map2_lgl
中的purrr
来检查每个any
中的timestamp
date
是between
start_time
和{ {1}}。
end_time
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。