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

按关联ID对应的时间区间过滤目标DataFrame数据

用df_1的时间区间过滤业务DataFrame的解决方案

没问题,我来帮你搞定这个需求——根据df_1里每个id对应的起止时间,筛选业务数据框里符合时间范围的记录。这里我用R语言的tidyverse工具链来实现,也会补充base R的方法,方便你根据习惯选择。

核心思路

  1. 把业务数据框(假设叫df_biz,包含id和业务时间列,比如event_time)和df_1按id关联起来;
  2. 筛选出event_time落在对应id的start和stop之间的记录;
  3. (可选)移除不需要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:40:44