标识一个数据框的日期时间是否在另一个数据框的一小时内

时间:2018-07-01 17:28:58

标签: r datetime dataframe

我有2个数据帧,A和B:

A

abc|def|datetime            |
1  |55 |2016-01-28 00:00:00 |
2  |53 |2016-01-28 00:30:00 |
3  |11 |2016-01-28 02:00:00 |

B

efg|hij|datetime            |
4  |ch |2016-01-28 00:11:00 |
5  |jw |2016-01-28 11:30:00 |
6  |q1 |2016-01-28 07:00:00 |

如果值B在一个小时后,我想在A的末尾添加一个真假列。还有一个显示值B的列在一个小时前。

输出:

abc|def|datetime            |After|Before|
1  |55 |2016-01-28 00:00:00 |  0  |  1   |
2  |53 |2016-01-28 00:30:00 |  1  |  0   |
3  |11 |2016-01-28 02:00:00 |  0  |  0   |

我尝试使用`library(lubridate):

for(i in seq(nrow(B))){
  for(j in seq(nrow(A))){
    if(A$datetime[j] %in% seq(B$datetime[i],B$datetime[i] + hours(1))){
      A$After[j] = 1
    }
  }
}

但是我无法使它正常工作。任何帮助将不胜感激。

其他信息:

数据帧未对齐,我想确定B中是否有任何情况在A之后或之前一个小时之内。如果是这种情况,则在该列中添加1。例如:

4 |ch |2016-01-28 00:11:00 |1 |55 |2016-01-28 00:00:00 |之后

4 |ch |2016-01-28 00:11:00 |2 |53 |2016-01-28 00:30:00 |之前

B是一个事件,我想确定与A有关的事件。

1 个答案:

答案 0 :(得分:1)

根据其他信息编辑的问题。在这种情况下,它稍微容易一些。您可以使用lubridate中的函数来查找日期时间是否在2个日期之间。为此,您需要2个功能。首先创建一个时间间隔对象,然后使用%within%函数查找日期是否落在一个时间间隔内。

在下面的代码中,我创建了两个时间间隔对象,之前和之后。要检查B的每个值是否落在一个间隔中,我们需要运行一个循环。

library(lubridate)

after_interval <- as.interval(3600, A$datetime)
# flip interval to get lower date first in the interval
before_interval <- int_flip(as.interval(-3600, A$datetime)) 

for(i in seq_along(length(B$datetime))) {
  After <- B$datetime[i] %within% after_interval
  After = as.integer(After)
  if(i == 1){
    AfterLoop = After
  } else {
      AfterLoop = AfterLoop + After}

  Before <- B$datetime[i] %within% before_interval 
  Before = as.integer(Before)
  if(i == 1){
    BeforeLoop = Before
  } else {
      BeforeLoop = BeforeLoop + Before}
}
A$After <- AfterLoop
A$Before <-BeforeLoop
A
  abc def            datetime After Before
1   1  55 2016-01-28 00:00:00  TRUE  FALSE
2   2  53 2016-01-28 00:30:00 FALSE   TRUE
3   3  11 2016-01-28 02:00:00 FALSE  FALSE