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

基于固定时间间隔的滚动窗口计数实现方案问询

解决方案

针对你需要基于可变时长的滚动窗口统计数据点数量的需求,以下两种方法都能实现,且支持灵活调整窗口时长:

方法一:用purrr逐行计算(直观易上手)

核心逻辑是对每个时间点,统计所有数据中落在「当前时间 - N小时」到「当前时间」范围内的记录数,通过参数window_hours可随时调整窗口时长。

library(tidyverse)
library(lubridate)

# 示例数据
df = tibble(id = 1:7,
            date_time = ymd_hm('2022-05-07 15:00', '2022-05-09 13:45', '2022-05-09 13:51', '2022-05-09 17:00',
                               '2022-05-10 15:25', '2022-05-10 17:18', '2022-05-11 14:00'))

# 定义窗口时长(可修改为任意小时数,示例为48小时)
window_hours <- 48

# 计算目标列
result <- df %>%
  mutate(
    lag_window = date_time - hours(window_hours), # 对应示例中的lag_48hours
    count = map_dbl(date_time, ~ sum(between(df$date_time, .x - hours(window_hours), .x)))
  )

# 输出结果
result

方法二:用slider包高效计算(适合大数据集)

如果数据量较大,逐行计算效率偏低,slider包的时间滚动窗口函数能更高效地处理这类需求,且无需手动遍历每一行。

library(slider)

# 先确保时间列有序(若原始数据无序,需先排序)
df_sorted <- df %>% arrange(date_time)

# 计算目标列
result_slider <- df_sorted %>%
  mutate(
    lag_window = date_time - hours(window_hours),
    count = slide_index_dbl(
      .x = date_time,
      .i = date_time,
      .f = ~ length(.x),
      .before = hours(window_hours)
    )
  )

# 输出结果
result_slider

结果匹配验证

两种方法生成的count列完全符合你的期望:

  • id=1时,窗口内仅自身,count=1
  • id=2时,窗口包含id=1和自身,count=2
  • id=3时,窗口包含id=1、2、3,count=3
  • 后续记录的count值也与示例中的期望结果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:43:04