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

使用slide_dfr在R中汇总一小时时间窗口数据时的问题求助

使用slide_dfr在R中汇总一小时时间窗口数据时的问题求助

我在R中有一个数据框,包含时间戳(time,这里日期无关,只需要时间部分)和对应的值(E),时间戳代表一天中的特定时刻,E代表该时刻的条目数。我的目标是找到E总和最大的一小时时间窗口,并获取这个窗口的开始和结束时间。

以下是我的示例数据:

library(tidyverse)

time <- c("1899-12-31 08:07:18 UTC", "1899-12-31 08:17:18 UTC",
"1899-12-31 08:27:33 UTC", "1899-12-31 08:57:28 UTC",
"1899-12-31 09:07:18 UTC", "1899-12-31 09:17:18 UTC",
"1899-12-31 09:27:19 UTC", "1899-12-31 09:57:52 UTC",
"1899-12-31 10:07:18 UTC", "1899-12-31 10:17:42 UTC",
"1899-12-31 11:37:42 UTC", "1899-12-31 11:47:35 UTC",
"1899-12-31 11:57:20 UTC", "1899-12-31 12:07:37 UTC",
"1899-12-31 12:17:18 UTC", "1899-12-31 12:27:18 UTC",
"1899-12-31 13:37:44 UTC", "1899-12-31 13:47:29 UTC",
"1899-12-31 13:57:08 UTC", "1899-12-31 14:07:00 UTC",
"1899-12-31 14:57:27 UTC", "1899-12-31 15:07:18 UTC",
"1899-12-31 15:37:15 UTC", "1899-12-31 15:47:18 UTC")

E <- c(1, 5, 3, 8, 7, 2, 7, 1, 3, 8, 4, 9,
10, 7, 2, 3, 6, 9, 8, 11, 5, 2, 3, 2)

df <- tibble(time, E) %>% mutate(time = as.POSIXct(time))

我尝试使用slider包的slide_dfr函数来实现这个需求,具体代码如下:

library(slider)

# 定义汇总函数
calculate_one_hour <- function(data) {
  print(paste("Number of rows in window:", nrow(data)))
  data <- data %>% drop_na(E, time)
  tibble(
    start_time = min(data$time, na.rm = TRUE),
    end_time = max(data$time, na.rm = TRUE),
    sum = sum(data$E, na.rm = TRUE)
  )
}

# 计算一天中时间对应的最小/最大秒数
min_time <- min(hour(df$time) * 3600 + minute(df$time) * 60 + second(df$time))
max_time <- max(hour(df$time) * 3600 + minute(df$time) * 60 + second(df$time))

# 生成最小到最大秒数的序列
all_seconds <- tibble(
  seconds = seq(from = min_time, to = max_time, by = 1)
)

# 合并原始数据和秒数序列
df <- df %>%
  mutate(seconds = as.integer(hour(time) * 3600 + minute(time) * 60 + second(time))) %>%
  right_join(all_seconds, by = "seconds")

# 滑动窗口计算
result <- df %>%
  arrange(seconds) %>%
  slide_dfr(.x = ., .i = all_seconds, .f = ~ calculate_one_hour(.x), .width = 3600)

# 找出总和最大的窗口
max_hour <- result %>%
  filter(sum == max(sum))

但现在遇到了问题:

  • 输出的result数据框行数和原始数据框一致,且所有行的start_time、end_time和sum值完全相同
  • 我在calculate_one_hour函数中打印了每个窗口的行数,结果都是1,这显然不对——我需要每个窗口包含对应一小时内的所有数据

有没有人能帮我理解为什么slide_dfr没有按预期工作?或者给我一些修改代码的建议,让我能实现找到E总和最大的一小时窗口的目标?非常感谢!

备注:内容来源于stack exchange,提问作者Rory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:00:29