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
相关产品推荐
相关产品推荐

