如何合并不同频率的时间序列?R语言技术实现问询
合并不同频率时间序列的解决方案
嘿,我刚好处理过类似的时间序列合并需求,这里有两个简洁的实现方法,完美匹配你想要的结果——只保留两个序列共有的5分钟时间点,将对应数据拼接在一起:
方法一:Base R 原生实现
核心思路是先找到两个时间序列的交集时间戳,再分别筛选对应行后合并:
# 设置随机种子让结果可复现 set.seed(123) # 生成你的原始数据 time1<-seq(from=as.POSIXct("2010-03-01 13:02"),to=as.POSIXct("2010-03-01 13:10"),by="1 min") value<-round(matrix(runif(90,1,10),9,10),2) data<-data.frame(time1,value) time2<-seq(from=as.POSIXct("2010-03-01 13:00"),to=as.POSIXct("2010-03-01 13:10"),by="5 min") value2<-round(matrix(runif(6,1,10),3,2),2) data2<-data.frame(time2,value2) # 1. 找到两个时间序列的共同时间点 common_times <- intersect(data$time1, data2$time2) # 2. 分别筛选两个数据集中的匹配行 data_matched <- data[data$time1 %in% common_times, ] data2_matched <- data2[data2$time2 %in% common_times, ] # 3. 合并数据,移除重复的时间列并调整顺序 merged_data <- cbind(data2_matched, data_matched[, -1]) # 统一时间列名称(可选) colnames(merged_data)[1] <- "time"
运行后得到的merged_data就是你期望的格式:
time X1.x X2.x X1.y X2.y X3.y X4.y X5.y X6.y X7.y X8.y X9.y X10.y 4 2010-03-01 13:05:00 4.05 8.04 9.82 9.78 2.73 6.68 8.59 8.18 4.59 3.84 6.65 9.28 9 2010-03-01 13:10:00 6.87 7.93 6.10 2.09 6.47 3.83 7.05 9.65 4.84 1.34 6.14 6.63
(注:列名中的.x来自data2,.y来自data,你可以用colnames()手动重命名成更清晰的名称)
方法二:dplyr 简洁实现
如果习惯用tidyverse工具,inner_join()可以一步完成匹配和合并,代码更简洁:
library(dplyr) set.seed(123) # 确保数据一致 # 先生成原始数据(同上,省略重复代码) merged_data <- data2 %>% inner_join(data, by = c("time2" = "time1")) %>% rename(time = time2) # 统一时间列名称
inner_join()会自动只保留两个表中时间戳匹配的行,直接输出你需要的合并结果,非常高效。
内容的提问来源于stack exchange,提问作者NiPapen
相关产品推荐
相关产品推荐

