如何在R中按小时对POSIXct类型的行数据求均值?
按小时聚合POSIXct时间序列数据求均值
我有一个名为df1的DataFrame,其中包含POSIXct类型的Date列,以及关联的数值列Value1和Value2,数据示例如下:
| Date | Value1 | Value2 |
|---|---|---|
| 2022-03-14 13:00:00 | 1 | 3 |
| 2022-03-14 13:10:00 | 2 | 4 |
| 2022-03-14 13:20:00 | 3 | 5 |
| 2022-03-14 13:30:00 | 4 | 6 |
| 2022-03-14 13:40:00 | 5 | 7 |
| 2022-03-14 13:50:00 | 6 | 8 |
| 2022-03-14 14:00:00 | 10 | 40 |
| 2022-03-14 14:10:00 | 20 | 50 |
| 2022-03-14 14:20:00 | 30 | 60 |
| 2022-03-14 14:30:00 | 40 | 70 |
| 2022-03-14 14:40:00 | 50 | 80 |
| 2022-03-14 14:50:00 | 60 | 90 |
需要按每天的小时对Value1和Value2求均值,生成新的DataFrame df2,其中Date列为对应小时的起始时间,Value1和Value2为该小时的均值。期望结果如下:
| Date | Value1 | Value2 |
|---|---|---|
| 2022-03-14 13:00:00 | 3.5 | 5.5 |
| 2022-03-14 14:00:00 | 35 | 65 |
解决方案
方法1:使用dplyr + lubridate
tidyverse生态下的简洁实现:
library(dplyr) library(lubridate) df2 <- df1 %>% mutate(Date_floor = floor_date(Date, "hour")) %>% group_by(Date_floor) %>% summarise(Value1 = mean(Value1), Value2 = mean(Value2)) %>% rename(Date = Date_floor) %>% ungroup()
方法2:使用data.table
适合大数据集的高效实现:
library(data.table) setDT(df1) df2 <- df1[, .(Value1 = mean(Value1), Value2 = mean(Value2)), by = .(Date = floor_date(Date, "hour"))]
方法3:基础R实现
无需额外依赖包:
# 生成小时级分组键 df1$hour_group <- as.POSIXct(strftime(df1$Date, "%Y-%m-%d %H:00:00")) # 聚合计算均值 df2 <- aggregate(cbind(Value1, Value2) ~ hour_group, data = df1, FUN = mean) colnames(df2)[1] <- "Date"
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

