如何将1分钟间隔数据集转换为小时平均值?含R语言及其他方法
1分钟环境监测数据转小时平均值的R实现方案
核心前提:正确转换时间格式
你的原始时间戳是日/月/年 时:分格式,必须先转成R可识别的POSIXct类型,这是后续分组计算的基础。
可行实现方法
方法1:tidyverse工具链(新手友好,可读性强)
# 加载依赖包 library(dplyr) library(lubridate) # 转换时间格式:dmy_hm专门适配日/月/年+时:分的格式 ref.data$TimeStamp <- dmy_hm(ref.data$TimeStamp) # 按小时分组(保留日期,避免不同天的同小时数据合并),批量计算所有监测指标的平均值 ref.data.hourly <- ref.data %>% group_by(hour_group = floor_date(TimeStamp, "hour")) %>% summarise(across(c(TSP, PM10, PM2.5, PM1, T, RH), mean, na.rm = TRUE))
floor_date(TimeStamp, "hour"):把每个时间戳向下取整到所属小时(比如14:08→14:00),确保同一小时的数据归为一组,且包含完整的日期信息。across(...):一次性对所有指定数值列计算平均值,不用逐个列写重复代码。
方法2:基础R实现(无需额外安装包)
# 转换时间格式,格式字符串要和原始数据完全匹配 ref.data$TimeStamp <- as.POSIXct(ref.data$TimeStamp, format = "%d/%m/%Y %H:%M") # 创建小时分组:cut函数直接按小时拆分时间序列 ref.data$hour_group <- cut(ref.data$TimeStamp, breaks = "hour") # 按分组计算所有监测指标的平均值 ref.data.hourly <- aggregate(. ~ hour_group, data = ref.data[, -1], FUN = mean, na.rm = TRUE)
aggregate(. ~ hour_group, ...):.代表除hour_group外的所有列,自动对每列按分组求平均。ref.data[, -1]:去掉原始TimeStamp列,避免重复计算。
方法3:data.table(大数据量首选)
如果数据集规模很大,data.table的计算效率远高于常规方法:
library(data.table) # 将数据框转为data.table格式 setDT(ref.data) # 转换时间并分组计算 ref.data[, TimeStamp := dmy_hm(TimeStamp)] ref.data.hourly <- ref.data[, lapply(.SD, mean, na.rm = TRUE), by = .(hour_group = floor_date(TimeStamp, "hour")), .SDcols = c("TSP", "PM10", "PM2.5", "PM1", "T", "RH")]
你之前代码的问题分析
第一段代码:
mean(val, na.rm = TRUE)中的val是未定义变量,需替换为实际列名或用批量处理逻辑。format(..., "%H")只提取小时数(比如14),会把不同日期的同一小时数据合并,导致结果错误。
第二段代码:
ref.data.xts$TimeStamp <- NULL中的ref.data.xts未提前定义,直接操作会报错。strptime返回的是POSIXlt类型,后续cut操作可能出现兼容性问题,建议统一用as.POSIXct转成POSIXct类型。
内容的提问来源于stack exchange,提问作者Muhsin
相关产品推荐
相关产品推荐

