R –如何在最近的时间日期合并两个数据帧?

use*_*405 1 datetime r

我有2个数据集,每个数据集包含POSIXlt格式的日期时间值,以及一些其他数字和字符变量。

我想结合基于日期时间列的两个数据集。但是两个数据集的日期戳不匹配,因此我需要按最近的日期(之前或之后)组合它们。在我的示例中,2016-03-01 23:52:00的数据值“ e”需要与2016-03-02 00:00:00的“ binH”组合,而不是“ binG”。

是否有一个函数可以让我按最近的日期时间值组合数据集,即使是在日期之后也可以?

我已经找到了使用cut()函数或data.tables中的roll = Inf函数将日期组合到下一个以前的日期的方法。但是我无法将时间戳记设置为roll ='nearest'可以接受的任何格式。

    >df1
    date1 value
    1 2016-03-01 17:52:00     a
    2 2016-03-01 18:01:30     b
    3 2016-03-01 18:05:00     c
    4 2016-03-01 20:42:30     d
    5 2016-03-01 23:52:00     e

    >df2
    date2 bin_name
    1 2016-03-01 17:00:00     binA
    2 2016-03-01 18:00:00     binB
    3 2016-03-01 19:00:00     binC
    4 2016-03-01 20:00:00     binD
    5 2016-03-01 21:00:00     binE
    6 2016-03-01 22:00:00     binF
    7 2016-03-01 23:00:00     binG
    8 2016-03-02 00:00:00     binH
    9 2016-03-02 01:00:00     binI
Run Code Online (Sandbox Code Playgroud)

ros*_*ova 5

data.table应该可以解决此问题(您能解释遇到的错误吗?),尽管它确实倾向于将POSIXlt自己转换为POSIXct(也许在datetime列上手动进行了这种转换以保持data.table快乐)。另外,在使用之前,请确保已设置键列roll

(我在这里创建了自己的示例表,使我的生活更轻松一些。如果您想在自己的示例上使用dput,我很高兴用您的数据更新此示例):

new <- data.table( date = as.POSIXct( c( "2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00" ) ), data.new = c( "t","u","v" ) )
head( new, 2 )

                  date data.new
1: 2016-03-02 12:20:00        t
2: 2016-03-07 12:20:00        u

old <- data.table( date = as.POSIXct( c( "2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00" ) ), data.old = c( "a","b","c","d" ) )
head( old, 2 )


                  date data.old
1: 2016-03-02 12:20:00        a
2: 2016-03-07 12:20:00        b

setkey( new, date )
setkey( old, date )

combined <- new[ old, roll = "nearest" ]
combined

                  date data.new data.old
1: 2015-03-02 12:20:00        t        d
2: 2016-03-02 12:20:00        t        a
3: 2016-03-07 12:20:00        u        b
4: 2016-04-02 12:20:00        v        c
Run Code Online (Sandbox Code Playgroud)

为了显示滚动联接如何处理多个匹配项,我有意使两个表的行长不同。您可以切换其加入方式:

combined <- old[ new, roll = "nearest" ]
combined

                  date data.old data.new
1: 2016-03-02 12:20:00        a        t
2: 2016-03-07 12:20:00        b        u
3: 2016-04-02 12:20:00        c        v
Run Code Online (Sandbox Code Playgroud)

  • @user2223405 这个解决方案对你有用吗?不管怎样,请确保你不会放弃你的问题。回来让我们知道什么有效,什么无效。 (2认同)