r - 按任意时间段聚合时间序列数据

标签 r time-series data.table aggregate

我有以下结构的数据:

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 日(例如 2020-09-01)开始到 8 月 31 日结束(例如 2021 年)的完整有效的年度圈子 -08-31)。 是否有一种非复杂的方法,最好使用纯 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 年的最后 4 个月(9 月至 12 月)
  • 2020 年为 TRUE,因为从 2019 年 9 月 1 日到 2020 年 8 月 31 日的全年均有效
  • 2021 为 FALSE,因为 2021-02-01 到 2021-05-31 的时间段无效
  • 2022 年为 TRUE,因为从 2021 年 9 月 1 日到 2022 年 8 月 31 日的全年均有效
  • 2023 为 TRUE,因为从 2022 年 9 月 1 日到 2023 年 8 月 31 日的全年均有效
  • 2024 为 FALSE,因为它缺少 2024 年的前 8 个月(1 月至 8 月)

最后的注释:

是否包含非完整年份(2019 年和 2024 年)是可选的,因为我不会进一步考虑它们。

当然,是否使用时间段的开始或结束(就像我在上面的示例中所做的那样)来确定年份名称是任意的。

最佳答案

不是 data.table 解决方案,但应该可以将其集成到 data.table 框架中。我使用ivs包来解决这个问题:

dtValid <- dt[dt$VALID]
ivs <- iv_groups(iv(as.Date(dtValid$TIME_FROM), as.Date(dtValid$TIME_TO) + 1))
#<iv<date>[2]>
#[1] [2019-01-01, 2021-02-01) [2021-06-01, 2024-01-01)

iv_yearly <-
  iv(seq(as.Date("2018-09-01"), by = "1 year", length.out = 6),
   seq(as.Date("2019-08-31"), by = "1 year", length.out = 6))
#<iv<date>[6]>
#[1] [2018-09-01, 2019-08-31) [2019-09-01, 2020-08-31)
#[3] [2020-09-01, 2021-08-31) [2021-09-01, 2022-08-31)
#[5] [2022-09-01, 2023-08-31) [2023-09-01, 2024-08-31)

iv_overlaps(iv_yearly, ivs, type = "within")
#[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE

关于r - 按任意时间段聚合时间序列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74744350/

相关文章:

r - 按日期和时间选择时间序列对象的间隔

r - 将多个时间间隔合并到一个组单元内(首选 dplyr 或 data.table 解决方案)

r - 带有空格的列名进行的data.table操作失败

r - 需要在R中跳过不同数量的行

python - 在 Python 中对选定的日期数据进行子集化

r - 转换 H :M:S character variable to numeric/continuous scale (R)

r - 为什么向量由 ':' 整数创建?

r - 如何使用自由刻度但在ggplot中保留固定引用点?

r - 创建可以输出多种文件类型的downloadButton R Shiny

r - 如何在合并的动物园对象中滞后一列