根据日期列合并数据集

Merging datasets based on date column

你好 Stack 社区,

我正在尝试根据每个数据集的日期列合并两个数据集。 以下是每个数据集的快照,其中可以清楚地看到日期列仅格式化为年月日,没有指定 hour:minute:second.

dataset 1; snapshot of date column

dataset 2; snapshot of date column

我正在使用以下代码合并两个数据集:

final <- merge(dataset1, dataset2, by.x="close_date", by.y = "date",all.x = TRUE, all.y = TRUE)

下面是显示上述代码结果的另一个快照。如您所见,hour:minute:second 以某种方式出现在日期列中,这会阻碍合并。

result of the merge

有没有办法正确合并两列?也许有人可以建议将 hh:mm:ss 设置为 00:00:00 的函数?顺便说一句,事先在脚本中,我使用 as.POSIXct 函数以相同的方式格式化了数据集 1 中的“close_date”列和数据集 2 中的“日期”列。

您可以在下面检查 head() 的 R 输出:

 head(dataset1) %>%
   select(close_date)
 
 A tibble: 6 x 1
  close_date         
  <dttm>             
1 2020-03-01 00:00:00
2 2020-03-02 00:00:00
3 2020-03-03 00:00:00
4 2020-03-04 00:00:00
5 2020-03-05 00:00:00
6 2020-03-06 00:00:00


 head(dataset2) %>%
   select(date)

 A tibble: 6 x 1
  date               
  <dttm>             
 1 2020-03-01 00:00:00
 2 2020-03-02 00:00:00
 3 2020-03-03 00:00:00
 4 2020-03-04 00:00:00
 5 2020-03-05 00:00:00
 6 2020-03-06 00:00:00

用提供的数据(以后请直接用dput(head(dataset1))提供数据。看这里How to make a great R reproducible example

我们可以在合并之前使用 lubridate 包的 ymd 函数定义每个数据集中的日期格式:

library(lubridate)

dataset1$close_date <- ymd(dataset1$close_date)
dataset2$date <- ymd(dataset2$date)

final <- merge(dataset1, dataset2, by.x="close_date", by.y = "date",all.x = TRUE, all.y = TRUE)
final
  close_date    coin case_count_world_
1 2020-03-01 BTCUSDT                  
2 2020-03-02 BTCUSDT                  
3 2020-03-03 BTCUSDT                  
4 2020-03-04 BTCUSDT                  
5 2020-03-05 BTCUSDT                  
6 2020-03-06    <NA>                  
7 2020-03-07    <NA>                  
8 2020-03-08    <NA>  

数据:

dataset1 <- structure(list(close_date = structure(c(18322, 18323, 18324, 
18325, 18326), class = "Date"), coin = c("BTCUSDT", "BTCUSDT", 
"BTCUSDT", "BTCUSDT", "BTCUSDT")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

dataset2 <- structure(list(date = structure(c(18322, 18323, 18324, 18325, 
18326, 18327, 18328, 18329), class = "Date"), case_count_world_ = c("", 
"", "", "", "", "", "", "")), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))