You need to enable JavaScript to run this app. R语言中如何将10分钟步长dataframe聚合为1小时平均值
优惠活动
大模型
产品
解决方案
定价
更多

R语言中如何将10分钟步长dataframe聚合为1小时平均值

10分钟步长观测数据转逐小时平均值的实现方案

方案一:tidyverse生态(代码易读,适合日常分析)

  • 适用场景:样本量中等、需要快速调试的常规分析流程
  • 可直接运行的代码:
library(dplyr)
library(lubridate)

# 替换为你实际读取的原始数据对象名
df_raw <- 你的原始数据
# 逐小时聚合
df_hourly <- df_raw %>% 
  # 原数据时间列名是...1,先重命名为便于操作的time
  rename(time = ...1) %>% 
  # 把时间截断到所属的整小时起始点,和标准1小时数据集时间戳规则匹配
  mutate(hour_bucket = floor_date(time, unit = "1 hour")) %>% 
  # 按小时分组,对所有数值列计算平均,自动忽略单时间点的NA值
  group_by(hour_bucket) %>% 
  summarise(
    across(everything(), ~ mean(.x, na.rm = TRUE)),
    .groups = "drop"
  ) %>% 
  # 把分组列重命名回标准时间列,即可和其他1小时数据集合并
  rename(time = hour_bucket)

方案二:data.table实现(运行高效,适合4年大样本数据)

  • 适用场景:连续4年的全量10分钟数据,处理速度比tidyverse快10~20倍,内存占用更低
  • 可直接运行的代码:
library(data.table)

# 替换为你实际读取的原始数据对象名
df_raw <- as.data.table(你的原始数据)
# 重命名时间列
setnames(df_raw, old = "...1", new = "time")

# 直接完成逐小时聚合
df_hourly <- df_raw[, 
  # 把10分钟时间戳截断到所属整小时点,保持UTC时区和原数据一致
  hour_time := as.POSIXct(
    floor(as.numeric(time)/3600)*3600, 
    origin = "1970-01-01", 
    tz = "UTC"
  )
][, 
  # 按小时分组,对所有非时间列计算平均
  lapply(.SD, mean, na.rm = TRUE), 
  by = hour_time, 
  .SDcols = !"time"
]

补充注意事项

  • 两种方法的小时聚合规则为:每个输出的小时时间点,对应原数据中该整小时内6个10分钟观测(如00:00的输出值为00:00/00:10/00:20/00:30/00:40/00:50共6个观测的平均),和绝大多数气象、环境类1小时公开数据集的计算规则完全匹配,可直接合并
  • 原数据中全NA的列(如示例里的Dd1_3...3)计算后会自动返回NA,符合常规数据处理逻辑
  • 如果需要过滤缺测过多的小时值,可在计算平均的环节增加样本数判断,例如把平均逻辑替换为~ ifelse(sum(!is.na(.x)) >= 3, mean(.x, na.rm = TRUE), NA),避免缺测超过一半的小时结果存在偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 11:36:04