【问题标题】:R Merge two data frames based on nearest date and time match [duplicate]R根据最近的日期和时间匹配合并两个数据框[重复]
【发布时间】:2025-11-27 01:20:04
【问题描述】:

我已经看到这个问题的各种解决方案仅基于日期,但时间部分让我感到困惑。我有两个带有 POSIXct 列的数据框,称为“日期时间”。对于 DF1,该列的数据四舍五入到最接近的小时。对于 DF2,时间分量不四舍五入到最接近的小时,并且可以随时发生。数据框如下所示:

DF1

datetime X Y Z
2020-09-01 03:00:00 1 3 4
2020-09-02 12:00:00 12 3 5
2020-09-02 22:00:00 4 9 19
2020-09-03 01:00:00 4 10 2
2020-09-04 06:00:00 4 12 1
2020-09-04 08:00:00 11 13 10

DF2

datetime Var
2020-09-01 02:23:14 A
2020-09-01 03:12:09 B
2020-09-02 11:52:15 A
2020-09-02 12:15:44 B
2020-09-02 22:31:56 A
2020-09-02 21:38:05 B
2020-09-03 01:11:39 A
2020-09-03 00:59:33 B
2020-09-04 05:12:19 A
2020-09-04 06:07:09 B
2020-09-04 08:22:28 A
2020-09-04 07:50:17 B

我想要的是基于此列使用与 DF1 中的“日期时间”最接近的日期和时间合并这两个数据帧,使其看起来像这样:

datetime X Y Z Var
2020-09-01 03:00:00 1 3 4 B
2020-09-02 12:00:00 12 3 5 A
2020-09-02 22:00:00 4 9 19 B
2020-09-03 01:00:00 4 10 2 B
2020-09-04 06:00:00 4 12 1 B
2020-09-04 08:00:00 11 13 10 B

谢谢!

【问题讨论】:

标签: r date time merge posixct


【解决方案1】:

mergegroup_by 添加辅助列,使用merge 然后dplyr 进行过滤

library(dplyr)

df1$tmp <- as.Date(df1$datetime)
df2$tmp <- as.Date(df2$datetime)

df1$grp <- 1:(nrow(df1))

merge(df1, df2, "tmp") %>% 
  group_by(grp) %>% 
  slice(which.min(abs(difftime(datetime.x, datetime.y)))) %>% 
  ungroup() %>% 
  select(-c(tmp,grp,datetime.y))
# A tibble: 6 × 5
  datetime.x              X     Y     Z Var  
  <chr>               <int> <int> <int> <chr>
1 2020-09-01 03:00:00     1     3     4 B    
2 2020-09-02 12:00:00    12     3     5 A    
3 2020-09-02 22:00:00     4     9    19 B    
4 2020-09-03 01:00:00     4    10     2 B    
5 2020-09-04 06:00:00     4    12     1 B    
6 2020-09-04 08:00:00    11    13    10 B

数据

df1 <- structure(list(datetime = c("2020-09-01 03:00:00", "2020-09-02 12:00:00", 
"2020-09-02 22:00:00", "2020-09-03 01:00:00", "2020-09-04 06:00:00", 
"2020-09-04 08:00:00"), X = c(1L, 12L, 4L, 4L, 4L, 11L), Y = c(3L, 
3L, 9L, 10L, 12L, 13L), Z = c(4L, 5L, 19L, 2L, 1L, 10L)), class = "data.frame", row.names = c(NA, 
-6L))

df2 <- structure(list(datetime = c("2020-09-01 02:23:14", "2020-09-01 03:12:09", 
"2020-09-02 11:52:15", "2020-09-02 12:15:44", "2020-09-02 22:31:56", 
"2020-09-02 21:38:05", "2020-09-03 01:11:39", "2020-09-03 00:59:33", 
"2020-09-04 05:12:19", "2020-09-04 06:07:09", "2020-09-04 08:22:28", 
"2020-09-04 07:50:17"), Var = c("A", "B", "A", "B", "A", "B", 
"A", "B", "A", "B", "A", "B")), class = "data.frame", row.names = c(NA, 
-12L))

【讨论】:

  • 这个解决方案工作得很好,但与我最终找到的上面的答案相比有点复杂。感谢您的努力,很抱歉浪费了您的时间。
  • @Jacob K,不用担心。如果您检查所有答案,我们现在有一个data.table 解决方案、一个自制合并功能和这个dplyr 方法。所以幸运的是这里没有冗余:)
最近更新 更多