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

如何用R的data.table按ID检测重叠日期范围并计算曝光占比

使用data.table处理客户合同重叠时段的曝光量计算

需求概述

  • 数据集以ID标识客户,每个客户有多份合同,每份合同包含PERIODSTART(起始日期)和PERIODEND(结束日期)字段
  • 需筛选出同一ID下存在两份及以上重叠合同的客户案例
  • 按ID和PRODUCTNUMBER分组,计算每份合同的年度占比曝光量,核心要求:合同重叠时段的曝光量不重复计算

示例数据集

library(data.table)
data = data.table(ID = c(rep("customer_1000", 7), rep("customer_78", 4), rep("customer_1047", 4)),
                  PERIODSTART = as.Date(c("1991-02-03", "1991-11-06", "1993-02-03", "1993-03-11", "1996-02-03", "1996-11-28", "1996-11-29",
                                          "2021-02-17", "2021-06-10", "2021-12-03", "2021-06-28",
                                          "2021-02-17", "2021-02-17", "2021-05-02", "2021-06-28")),
                  PERIODEND = as.Date(c("1991-11-06", "1992-02-03", "1993-03-11", "1994-02-03", "1996-11-28", "1996-11-29", "1997-02-03",
                                          "2021-09-30", "2021-11-09", "2021-12-20", "2021-10-14",
                                          "2021-09-30", "2021-08-01", "2021-06-17", "2021-10-14")),
                  PRODUCTNUMBER = c(rep("product_1", 7), 
                                    "product_74", "product_88", "product_76", "product_25",
                                    "product_1", "product_2", "product_3", "product_4")
                  )

data[, year := year(PERIODSTART)]

期望计算规则

  1. 基础非重叠场景:单份合同的曝光量为其时段在对应年度的天数占比(年度天数需根据平闰年取365或366)
  2. 部分重叠场景:两份合同存在重叠区间时,重叠部分仅计算一次曝光量,每份合同的有效曝光为自身非重叠时段占比,加上重叠时段占比按合同数量均分
  3. 嵌套重叠场景:多份合同完全嵌套时,仅计算最外层合同的完整时段,内部合同的重叠区域不重复计算曝光量
  4. 交叉重叠场景:多份合同交叉覆盖时,先合并所有重叠区间为连续的无重叠时段,再统计每份原始合同在这些时段中的覆盖长度,最终换算为年度占比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:23:08