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

基于8小时间隔合并时间戳识别独立访问的R技术问题

基于8小时间隔合并时间戳的R实现方案

需求说明

基于8小时间隔规则合并时间戳区间:当同一id下,某事件的end_timestamp与下一个事件的start_timestamp间隔≥8小时,视为独立事件;否则合并这两个区间,取该组事件的最小start_timestamp和最大end_timestamp。

输入数据

df <- data.frame(id = c("A", "A", "A", "A", "A", "A", "B", "B"),
                 start_timestamp = c("2022-04-26 23:36:00", "2022-04-27 18:29:00", "2022-04-29 11:37:00", "2022-05-02 22:29:00", "2022-05-10 10:06:00", "2022-05-12 19:57:00", "2022-04-01 12:00:00", "2022-04-04 15:35:00"),
                 end_timestamp = c("2022-04-27 12:28:00", "2022-04-29 07:00:00", "2022-05-02 13:41:00", "2022-05-10 09:00:00", "2022-05-12 15:16:00", "2022-05-15 15:12:00", "2022-04-04 11:49:00", "2022-04-07 11:42:00"))

df$start_timestamp <- as.POSIXct(df$start_timestamp)
df$end_timestamp <- as.POSIXct(df$end_timestamp)

输入数据预览:

> df
  id     start_timestamp       end_timestamp
1  A 2022-04-26 23:36:00 2022-04-27 12:28:00
2  A 2022-04-27 18:29:00 2022-04-29 07:00:00
3  A 2022-04-29 11:37:00 2022-05-02 13:41:00
4  A 2022-05-02 22:29:00 2022-05-10 09:00:00
5  A 2022-05-10 10:06:00 2022-05-12 15:16:00
6  A 2022-05-12 19:57:00 2022-05-15 15:12:00
7  B 2022-04-01 12:00:00 2022-04-04 11:49:00
8  B 2022-04-04 15:35:00 2022-04-07 11:42:00

期望输出

> df
  id visit     start_timestamp       end_timestamp
1  A     0 2022-04-26 23:36:00 2022-05-02 13:41:00
2  A     1 2022-05-02 22:29:00 2022-05-15 15:12:00
3  B     0 2022-04-01 12:00:00 2022-04-07 11:42:00

解决方案代码

使用dplyr包处理分组、标记和聚合:

library(dplyr)

result_df <- df %>%
  group_by(id) %>%
  # 计算当前行start与前一行end的时间差(单位:小时),第一行设为NA
  mutate(time_diff_hours = difftime(start_timestamp, lag(end_timestamp), units = "hours")) %>%
  # 标记是否需要开启新的visit:时间差≥8小时或为第一行时,标记为1,否则0
  mutate(new_visit = ifelse(is.na(time_diff_hours) | time_diff_hours >= 8, 1, 0)) %>%
  # 累加new_visit生成visit分组编号,从0开始
  mutate(visit = cumsum(new_visit) - 1) %>%
  # 按id和visit分组,聚合最小start和最大end
  group_by(id, visit) %>%
  summarise(start_timestamp = min(start_timestamp),
            end_timestamp = max(end_timestamp),
            .groups = "drop")

print(result_df)

代码解释

  1. 分组计算时间差:按id分组后,用lag()函数获取前一行的end_timestamp,计算当前行start_timestamp与它的时间差(单位为小时)。
  2. 标记新事件组:第一行无前置事件,直接标记为新组;若时间差≥8小时,也标记为新组。
  3. 生成visit编号:通过累加new_visit的值,将连续的非独立事件归为同一个visit组,编号从0开始。
  4. 聚合区间:按id和visit分组,取每组的最小start_timestamp和最大end_timestamp,得到合并后的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:47:04