You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中基于一个数据集的时间范围过滤另一数据集的时间记录

日期时间数据最佳格式化方案

最优选择是将分列存储的Date和Time字段合并为R原生的POSIXct类型完整时间戳,原因如下:

  • 原生时间类型支持直接使用比较运算符判断时间范围,无需拆分字符串做数值判断,出错概率低
  • 合并后的时间戳天然覆盖跨天场景,不会出现仅比较时分秒导致的逻辑漏洞
  • 适配后续时间差计算、时间分组等扩展分析需求

R实现过滤操作

我们可以用tidyverse生态工具快速完成需求,步骤如下:

1. 加载依赖包

library(dplyr)
library(lubridate)

2. 清洗两个数据集的时间字段

首先处理Active表,生成每条记录的进入、离开完整时间戳:

Active_clean <- Active %>%
  mutate(
    start_ts = dmy(Date) + hms(Start),
    end_ts = dmy(Date) + hms(End)
  ) %>%
  select(ID, start_ts, end_ts)

再处理Detections表,生成检测时间的完整时间戳:

Detections_clean <- Detections %>%
  mutate(detect_ts = dmy(Date) + hms(Time))

3. 过滤符合要求的检测记录

这里提供两种常用实现方式:

方式1:逐行判断(无需额外依赖包)
final_result <- Detections_clean %>%
  rowwise() %>%
  filter(
    any(
      Active_clean$ID == ID & 
      Active_clean$start_ts <= detect_ts & 
      Active_clean$end_ts >= detect_ts
    )
  ) %>%
  ungroup() %>%
  select(ID, Date, Time)
方式2:非等值连接(大数据量下效率更高)

如果数据量较大可以用fuzzyjoin包的区间连接优化性能:

# 首次使用先安装包
# install.packages("fuzzyjoin")
library(fuzzyjoin)

final_result <- interval_join(
  Detections_clean,
  Active_clean,
  by = c("ID" = "ID", "detect_ts" = "start_ts", "detect_ts" = "end_ts"),
  match_fun = list(`==`, `>=`, `<=`)
) %>%
  select(ID, Date, Time) %>%
  distinct()

两种方法运行后得到的结果和你给出的预期输出完全一致。


内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 23:54:05