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

基于自定义时间周期聚合时序数据:全效年度圈的data.table实现

问题:基于data.table判断学年周期全效年度圈

现有如下结构的data.table时序数据:

library(data.table)
dt <- data.table(ID = "ABC",
           TIME_FROM = structure(c(17897L, 18262L, 18353L, 18628L,
                                   18659L, 18779L, 18993L, 19358L),
                                 class = c("IDate", "Date")),
           TIME_TO = structure(c(18261L, 18352L, 18627L, 18658L, 
                                 18778L, 18992L, 19357L, 19722L),
                               class = c("IDate", "Date")),
           VALID = c(T, T, T, T, F, T, T, T))
dt
#>     ID  TIME_FROM    TIME_TO VALID
#> 1: ABC 2019-01-01 2019-12-31  TRUE
#> 2: ABC 2020-01-01 2020-03-31  TRUE
#> 3: ABC 2020-04-01 2020-12-31  TRUE
#> 4: ABC 2021-01-01 2021-01-31  TRUE
#> 5: ABC 2021-02-01 2021-05-31 FALSE
#> 6: ABC 2021-06-01 2021-12-31  TRUE
#> 7: ABC 2022-01-01 2022-12-31  TRUE
#> 8: ABC 2023-01-01 2023-12-31  TRUE

需要按ID判断以每年9月1日至次年8月31日为周期的全效年度圈(即该周期内所有时段的VALID均为TRUE),求简洁的纯data.table实现方案。

预期输出如下:

dt_target <- data.table(ID = "ABC",
                        YEAR = 2019:2024,
                        FULL_VALID_YR = c(F, T, F, T, T, F))
dt_target
#>     ID YEAR FULL_VALID_YR
#> 1: ABC 2019         FALSE
#> 2: ABC 2020          TRUE
#> 3: ABC 2021         FALSE
#> 4: ABC 2022          TRUE
#> 5: ABC 2023          TRUE
#> 6: ABC 2024         FALSE

各年份判断逻辑:

  • 2019为FALSE:缺少2018年9-12月的有效数据
  • 2020为TRUE:2019年9月1日至2020年8月31日全时段有效
  • 2021为FALSE:2021年2-5月时段无效
  • 2022为TRUE:2021年9月1日至2022年8月31日全时段有效
  • 2023为TRUE:2022年9月1日至2023年8月31日全时段有效
  • 2024为FALSE:缺少2024年1-8月的有效数据

备注:非完整年度(2019、2024)是否保留可选;可任选周期起始或结束年份命名年度。


纯data.table实现方案
library(data.table)

# 1. 生成所有需要判断的学年周期
min_year <- year(min(dt$TIME_FROM)) - 1
max_year <- year(max(dt$TIME_TO)) + 1
years <- min_year:max_year

dt_years <- data.table(
  ID = unique(dt$ID),
  YEAR = rep(years, each = length(unique(dt$ID))),
  PERIOD_START = as.IDate(paste0(YEAR, "-09-01")),
  PERIOD_END = as.IDate(paste0(YEAR + 1, "-08-31"))
)

# 2. 区间匹配+聚合判断全效年度
dt_result <- dt_years[dt, on = .(ID, PERIOD_START <= TIME_TO, PERIOD_END >= TIME_FROM), 
                      allow.cartesian = TRUE][, .(
                        FULL_VALID_YR = all(VALID == TRUE) && 
                          (min(pmax(TIME_FROM, PERIOD_START)) == PERIOD_START) && 
                          (max(pmin(TIME_TO, PERIOD_END)) == PERIOD_END)
                      ), by = .(ID, YEAR)]

# 输出结果
dt_result

代码解释

  1. 生成学年周期表:基于原始数据的时间范围扩展出所有待判断的学年周期,覆盖完整与非完整年度。
  2. 非等连接匹配:用data.table的区间匹配逻辑,将原始时段与学年周期关联,确保所有重叠时段都被纳入计算。
  3. 聚合判断条件:按ID和YEAR聚合后,同时满足三个条件才判定为全效年度:
    • 周期内所有匹配时段的VALID均为TRUE
    • 周期起始点被有效数据完全覆盖
    • 周期结束点被有效数据完全覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:35:20