在R中按时间分段计算时间序列指定属性的均值与标准差
按时间分段计算时间序列统计量的R实现
数据集示例
df <- data.frame( X = c( 243813.672143309, 243820.16680888, 243819.847679243, 243816.851755806, 243814.016524682, 243817.173014157 ), Y = c( 717413.771532459, 717412.74899267, 717412.77789073, 717414.049964481, 717415.983508272, 717414.873097992 ), T = as.POSIXct( c( "2021-04-01 21:30:06.186", "2021-04-01 21:30:14.186", "2021-04-01 21:30:22.186", "2021-04-01 21:30:30.185", "2021-04-01 21:30:38.185", "2021-04-01 21:30:46.185" ), tz = "GMT" ), sp = c( 0, 6.57466869906985, 0.320435364660776, 3.25480089593961, 3.43178191624026, 3.34610770929176 ), ta = c(0, 0, 0.0658546845459325, 0.311226675793708, 0.196989706737039, 0.260257380057078), row.names = 1688614:1688619 )
需求
按T列(时间属性)将时间序列按每3分钟分段,计算每个分段内sp和ta的均值与标准差,避免使用循环,采用R 4.2.1中的高效方案。
方案一:tidyverse生态(dplyr + lubridate)
这是R中最常用的数据分析工作流,代码可读性强,适合大多数场景:
# 首次使用需先安装包 # install.packages(c("dplyr", "lubridate")) library(dplyr) library(lubridate) # 执行分组计算 result_dplyr <- df %>% # 生成3分钟间隔的分组标签:将每个时间点向下取整到最近的3分钟起始时刻 mutate(time_group = floor_date(T, unit = "3 minutes")) %>% # 按分组标签聚合数据 group_by(time_group) %>% summarise( sp均值 = mean(sp, na.rm = TRUE), sp标准差 = sd(sp, na.rm = TRUE), ta均值 = mean(ta, na.rm = TRUE), ta标准差 = sd(ta, na.rm = TRUE), .groups = "drop" # 计算完成后取消分组状态 ) # 查看结果 print(result_dplyr)
方案二:data.table(高效处理大规模数据集)
如果你的数据集行数很多(百万级以上),data.table的运算速度会远快于dplyr,适合高性能需求:
# 首次使用需先安装包 # install.packages("data.table") library(data.table) # 将数据框转换为data.table格式 dt <- as.data.table(df) # 执行分组计算 result_dt <- dt[, .( sp均值 = mean(sp, na.rm = TRUE), sp标准差 = sd(sp, na.rm = TRUE), ta均值 = mean(ta, na.rm = TRUE), ta标准差 = sd(ta, na.rm = TRUE) ), by = .(time_group = floor_date(T, unit = "3 minutes"))] # 查看结果 print(result_dt)
补充说明
- 调整分段逻辑:可以把
floor_date换成ceiling_date(向上取整到3分钟结束时刻)或round_date(四舍五入到最近的3分钟节点) - 缺失值处理:
na.rm = TRUE用于忽略缺失值,数据无缺失可直接去掉该参数 - 结果一致性:两种方案输出结构完全一致,可根据数据规模和个人习惯选择
内容的提问来源于stack exchange,提问作者Observarun
相关产品推荐
相关产品推荐

