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

如何合并不同频率的时间序列?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:25:11