如何按相似Datetime分组?1小时内交易分组需求及R数据示例
按用户分组并聚合1小时内的交易
可以用dplyr和lubridate包实现需求,核心思路是按用户分组后,通过时间差判断是否开启新分组:
# 加载示例数据 df <- structure(list(`data hora` = c("01/10/2023 01:00", "01/10/2023 01:32", "01/10/2023 01:45", "04/10/2023 03:10", "04/10/2023 03:12", "06/10/2023 01:00", "01/10/2023 01:00", "01/10/2023 01:32", "02/10/2023 01:45"), user = c("12345ag", "12345ag", "12345ag", "12345ag", "12345ag", "12345ag", "4569lç", "4569lç", "4569lç"), id_transacion = c(1, 2, 3, 4, 5, 6, 7, 8, 9))) library(dplyr) library(lubridate) # 数据处理流程 df_processed <- df %>% # 将字符型时间转换为可计算的时间格式 mutate(`data hora` = dmy_hm(`data hora`)) %>% # 按用户和时间排序,确保时间顺序正确 arrange(user, `data hora`) %>% # 按用户分组处理 group_by(user) %>% # 计算当前交易与上一条的时间差(单位:小时) mutate(time_diff = difftime(`data hora`, lag(`data hora`), units = "hours")) %>% # 生成分组ID:第一条记录或时间差超过1小时时,开启新分组 mutate(group_id = cumsum(is.na(time_diff) | time_diff > 1)) %>% ungroup() # 输出结果 print(df_processed)
运行后得到的分组结果如下:
| data hora | user | id_transacion | time_diff | group_id |
|---|---|---|---|---|
| 2023-10-01 01:00:00 | 12345ag | 1 | NA | 1 |
| 2023-10-01 01:32:00 | 12345ag | 2 | 0.5333333 hours | 1 |
| 2023-10-01 01:45:00 | 12345ag | 3 | 0.2166667 hours | 1 |
| 2023-10-04 03:10:00 | 12345ag | 4 | 73.4166667 hours | 2 |
| 2023-10-04 03:12:00 | 12345ag | 5 | 0.0333333 hours | 2 |
| 2023-10-06 01:00:00 | 12345ag | 6 | 45.8 hours | 3 |
| 2023-10-01 01:00:00 | 4569lç | 7 | NA | 1 |
| 2023-10-01 01:32:00 | 4569lç | 8 | 0.5333333 hours | 1 |
| 2023-10-02 01:45:00 | 4569lç | 9 | 24.2166667 hours | 2 |
这个结果完全匹配你期望的分组逻辑:同一用户下,间隔1小时内的交易归为同一组,超过1小时则新建分组。
内容的提问来源于stack exchange,提问作者viniciuscaldeira
相关产品推荐
相关产品推荐

