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

如何将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")]

你之前代码的问题分析

  1. 第一段代码:

    • mean(val, na.rm = TRUE)中的val是未定义变量,需替换为实际列名或用批量处理逻辑。
    • format(..., "%H")只提取小时数(比如14),会把不同日期的同一小时数据合并,导致结果错误。
  2. 第二段代码:

    • ref.data.xts$TimeStamp <- NULL中的ref.data.xts未提前定义,直接操作会报错。
    • strptime返回的是POSIXlt类型,后续cut操作可能出现兼容性问题,建议统一用as.POSIXct转成POSIXct类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:30:58