在R中将1分钟间隔的10分钟滑动平均气象数据转为小时平均
解决方法
针对你的需求——基于1分钟间隔的10分钟滑动平均数据,计算每小时的平均(取间隔10分钟的6个点),这里有两种简洁的R实现方案:
方案一:用dplyr + lubridate(适合数据清洗和分组处理)
首先我们需要先筛选出间隔10分钟的时间点(也就是分钟数为0、10、20、30、40、50的行),因为原始数据是每分钟一条的10分钟滑动平均,这些点正好是你需要的10分钟间隔的样本。然后再按小时窗口分组计算平均。
步骤代码:
# 加载所需包 library(dplyr) library(lubridate) # 你的示例数据 timeLine <- structure( list( Date = structure(c(1499270460, 1499270520, 1499270580, 1499270640, 1499270700, 1499270760, 1499270820, 1499270880, 1499270940, 1499271000), class = c("POSIXct", "POSIXt"), tzone = "Asia/Hong_Kong"), Direction = c(93L, 92L, 92L, 91L, 91L, 91L, 91L, 90L, 90L, 91L), Speed = c(7.3, 7.4, 7.3, 7.4, 7.3, 7.3, 7.2, 7.1, 6.9, 6.7)), .Names = c("Date", "Direction", "Speed"), row.names = c(NA, 10L), class = "data.frame") # 1. 筛选10分钟间隔的点(分钟数为10的倍数) filtered_data <- timeLine %>% filter(minute(Date) %% 10 == 0) # 2. 计算小时平均:每个整点取自身及前5个10分钟点的平均 hourly_avg <- filtered_data %>% # 为每个点标记所属的小时平均窗口(对应整点时间) mutate(Hour_Date = ceiling_date(Date - minutes(1), "hour")) %>% # 按小时窗口分组 group_by(Hour_Date) %>% # 确保每个组有6个点(数据完整时),计算平均 summarise( Avg_Direction = ifelse(n() == 6, mean(Direction), NA_real_), Avg_Speed = ifelse(n() == 6, mean(Speed), NA_real_), .groups = "drop" ) # 查看结果 hourly_avg
这里ceiling_date(Date - minutes(1), "hour")的作用是:把9:10到10:00的所有点都归到10:00的小时窗口下,正好对应你需要的“计算10:00的平均时取10:00及前5个10分钟点”的逻辑。
方案二:用zoo包的rollapply(适合时间序列滚动计算)
如果你的数据是规整的时间序列(无缺失的10分钟间隔点),用rollapply会更高效:
步骤代码:
# 加载zoo包 library(zoo) # 1. 筛选10分钟间隔的点(同方案一) filtered_data <- timeLine %>% filter(minute(Date) %% 10 == 0) # 2. 转换为zoo时间序列对象 zoo_ts <- zoo(filtered_data[, c("Direction", "Speed")], order.by = filtered_data$Date) # 3. 滚动计算每6个点的平均(align="right"对应窗口最后一个点的时间,即整点) hourly_avg_zoo <- rollapply( zoo_ts, width = 6, # 窗口大小:6个10分钟点=1小时 FUN = mean, # 计算平均 align = "right", # 结果对应窗口的最后一个时间点 fill = NA # 数据不足6个点时填充NA ) # 转换回data.frame格式 hourly_avg_df <- as.data.frame(hourly_avg_zoo) %>% mutate(Hour_Date = index(hourly_avg_zoo)) %>% select(Hour_Date, Avg_Direction = Direction, Avg_Speed = Speed) # 查看结果 hourly_avg_df
这个方法的核心是利用rollapply的width=6,直接取当前点和前5个10分钟间隔的点计算平均,完全匹配你的需求。
注意事项
- 如果你的原始数据存在缺失值(比如某10分钟点缺失),两种方案都会返回NA,你可以根据需求调整处理逻辑(比如用
na.rm=TRUE在mean函数中忽略NA,或者填充缺失值)。 - 示例数据只有10行(到10:10),所以筛选后只有1个点,无法计算完整的小时平均,你可以用完整数据测试上述代码。
内容的提问来源于stack exchange,提问作者T Lee
相关产品推荐
相关产品推荐

