如何按5分钟间隔筛选DataFrame中最近的时间条目?
解决方案
要实现保留每5分钟间隔内的最近(最晚)条目,可通过按5分钟时间区间分组,再在每个组内筛选出时间最晚的记录,具体步骤如下:
- 用
lubridate的floor_date()函数将时间向下取整到最近的5分钟整点,以此作为分组依据; - 对每个分组,使用
slice_max()筛选出时间最晚的条目。
代码示例:
library(tidyverse) library(lubridate) # 原始数据生成代码 set.seed(1) start <- mdy_hms("11-20-2023 00:00:00") int <- 61 end <- start + as.difftime(2, units = "hours") dt <- seq(from = start, to = end, by = int) time <- sample(dt, 30) value <- sample(1:10,30, replace = TRUE) tb <- tibble(time,value) %>% arrange(time) # 核心筛选逻辑 tb_filtered <- tb %>% # 按5分钟区间分组,对齐到最近的5分钟整点(如00:00、00:05等) group_by(time_group = floor_date(time, "5 minutes")) %>% # 每个组内保留时间最晚的记录 slice_max(time, n = 1) %>% # 移除分组列(可选操作) ungroup() %>% select(-time_group) # 查看筛选结果 tb_filtered %>% head(10)
结果说明
运行代码后,筛选结果会完全匹配你的需求:
- 00:00-00:05区间保留
2023-11-20 00:00:00(该区间内最晚记录); - 00:05-00:10区间保留
2023-11-20 00:06:00(该区间内最晚记录); - 00:30-00:35区间保留
2023-11-20 00:33:00(而非00:32:00,因为它是区间内更晚的记录)。
原方法问题分析
你之前用round(minute(time)/5)*5的取整方式是四舍五入到最近5分钟,逻辑上不符合区间划分需求:
- 00:06:00被错误归到00:05的组,但它实际属于00:05-00:10的区间;
- 00:32:00被归到00:30的组,但该区间内还有更晚的00:33:00,导致错误保留了较早的记录。
而floor_date是严格按左闭右开的5分钟区间(如[00:00,00:05)、[00:05,00:10))划分,确保每个区间只保留最晚条目,完全匹配你的筛选要求。
内容的提问来源于stack exchange,提问作者AColoredReptile
相关产品推荐
相关产品推荐

