按关联ID对应的时间区间过滤目标DataFrame数据
用df_1的时间区间过滤业务DataFrame的解决方案
没问题,我来帮你搞定这个需求——根据df_1里每个id对应的起止时间,筛选业务数据框里符合时间范围的记录。这里我用R语言的tidyverse工具链来实现,也会补充base R的方法,方便你根据习惯选择。
核心思路
- 把业务数据框(假设叫
df_biz,包含id和业务时间列,比如event_time)和df_1按id关联起来; - 筛选出
event_time落在对应id的start和stop之间的记录; - (可选)移除不需要的
start和stop列。
具体实现代码
首先确保你的时间列都是datetime类型(比如POSIXct),如果不是的话,先转换:
# 转换时间列(如果需要) df_1$start <- as.POSIXct(df_1$start) df_1$stop <- as.POSIXct(df_1$stop) df_biz$event_time <- as.POSIXct(df_biz$event_time)
方法1:用tidyverse(推荐,代码更清晰)
library(tidyverse) # 关联+过滤 df_filtered <- df_biz %>% left_join(df_1, by = "id") %>% # 筛选:要么id不在df_1里(保留全部记录),要么时间在区间内 filter(is.na(start) | (event_time >= start & event_time <= stop)) %>% # 移除起止时间列(如果不需要保留的话) select(-start, -stop)
方法2:用Base R
如果你习惯用base R,也可以这样写:
# 合并两个数据框 merged_df <- merge(df_biz, df_1, by = "id", all.x = TRUE) # 筛选符合条件的记录 df_filtered <- subset( merged_df, event_time >= start & event_time <= stop | is.na(start) ) # 移除起止时间列 df_filtered <- df_filtered[, !names(df_filtered) %in% c("start", "stop")]
示例测试
我构造了一个业务数据框的示例,你可以直接跑一遍验证效果:
# 构造示例业务数据 df_biz <- tibble( id = c(12, 12, 18, 18, 20), event_time = ymd_hms(c( "2018-04-10 10:00:00", # id12:不在区间,会被过滤 "2018-04-10 15:00:00", # id12:在区间内,保留 "2018-02-01 05:00:00", # id18:在区间内,保留 "2018-02-01 10:00:00", # id18:不在区间,过滤 "2018-03-01 12:00:00" # id20:不在df_1里,会被保留 )) ) # 运行筛选代码后,df_filtered会包含3条记录:id12的15点、id18的5点、id20的12点
如果你的业务数据框里没有需要保留“不在df_1里的id”的场景,只需要把filter里的is.na(start) |去掉就行,这样只会保留在df_1里有对应时间区间且符合条件的记录。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

