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

如何合并时间不匹配、列不同的两个时间序列DataFrame?

问题解决

基础需求:全外连接并按时间排序

直接用merge或left_join达不到效果的原因:

  • merge默认是内连接,只保留两表timeStamp完全匹配的行,不会包含各自独有的时间点
  • left_join以左表为基准,不会纳入右表中左表没有的时间行

要实现全量时间保留、不匹配列填NA、按时间排序,有两种实现方式:

方法1:Base R 实现

# 执行全外连接,再按时间戳排序
merged_df <- merge(df1, df2, by = "timeStamp", all = TRUE)
merged_df <- merged_df[order(merged_df$timeStamp), ]

方法2:Tidyverse 工具包实现

library(dplyr)

merged_df <- full_join(df1, df2, by = "timeStamp") %>% 
  arrange(timeStamp)

运行后得到的基础结果:

timeStamp value text
1 2022-07-29 00:00:00     1 <NA>
2 2022-07-29 00:00:05    NA    a
3 2022-07-29 00:05:00     2 <NA>
4 2022-07-29 00:05:05    NA    b
5 2022-07-29 00:10:00     3 <NA>
6 2022-07-29 00:15:00     4 <NA>
7 2022-07-29 00:20:00     5 <NA>
8 2022-07-29 00:20:05    NA    c

进阶需求:填充text直到下一次变化

在基础合并结果的基础上,用tidyr的fill函数向下填充NA值即可:

library(dplyr)
library(tidyr)

final_df <- full_join(df1, df2, by = "timeStamp") %>% 
  arrange(timeStamp) %>% 
  fill(text, .direction = "down")

运行后得到的进阶结果:

timeStamp value text
1 2022-07-29 00:00:00     1 <NA>
2 2022-07-29 00:00:05    NA    a
3 2022-07-29 00:05:00     2    a
4 2022-07-29 00:05:05    NA    b
5 2022-07-29 00:10:00     3    b
6 2022-07-29 00:15:00     4    b
7 2022-07-29 00:20:00     5    b
8 2022-07-29 00:20:05    NA    c

如果不用Tidyverse,也可以用Base R结合zoo包实现:

library(zoo)

merged_df <- merge(df1, df2, by = "timeStamp", all = TRUE)
merged_df <- merged_df[order(merged_df$timeStamp), ]
merged_df$text <- na.locf(merged_df$text, na.rm = FALSE)

内容的提问来源于stack exchange,提问作者ambergris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:55:24