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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:26