匹配时间在开始和结束时间之间的时间间隔

时间:2011-02-25 22:00:52

标签: datetime r time

StackOverflow的R用户 -

我必须将一组不同的时间匹配到另一个数据帧中由开始和结束定义的时间间隔。这将导致一个数据框具有多对一关系。

要匹配的简化记录集如下:

       vid               start                 end
17599 7588 2011-02-14 19:00:00 2011-02-14 19:11:00
17601 7588 2011-02-14 19:58:00 2011-02-14 20:43:00
17603 7588 2011-02-14 21:22:00 2011-02-14 22:00:00

与上述数据匹配的一些示例记录是:

        vid            datetime
469818 7588 2011-02-14 19:00:10
470747 7588 2011-02-14 19:59:10
470788 7588 2011-02-14 21:23:10

我想要的是:

        vid            datetime               start                 end
        7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
        7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
        7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00

对于我的生活,我无法弄清楚如何在R中做到这一点。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

可重复的例子:

txt1 <- "       vid               start                 end
17599 7588 '2011-02-14 19:00:00' '2011-02-14 19:11:00'
17601 7588 '2011-02-14 19:58:00' '2011-02-14 20:43:00'
17603 7588 '2011-02-14 21:22:00' '2011-02-14 22:00:00'
"
txt2 <- "        vid            datetime
469818 7588 '2011-02-14 19:00:10'
470747 7588 '2011-02-14 19:59:10'
470788 7588 '2011-02-14 21:23:10'
"
d1 <- read.table(textConnection(txt1), header = TRUE,
                 colClasses = c("integer","integer","POSIXct","POSIXct"))
d2 <- read.table(textConnection(txt2), header = TRUE,
                 colClasses = c("integer","integer","POSIXct"))

我们可以使用以下内容获取d1中与d2的每一行对应的索引(行):

> idx <- sapply(d2$datetime, 
+               function(x, start, end) {which(x > start & x < end)}, 
+               d1$start, d1$end)
> idx
[1] 1 2 3

我们可以使用索引idxd1的元素绑定到d2

> cbind(d2, d1[idx, 2:3])
        vid            datetime               start                 end
469818 7588 2011-02-14 19:00:10 2011-02-14 19:00:00 2011-02-14 19:11:00
470747 7588 2011-02-14 19:59:10 2011-02-14 19:58:00 2011-02-14 20:43:00
470788 7588 2011-02-14 21:23:10 2011-02-14 21:22:00 2011-02-14 22:00:00

答案 1 :(得分:1)

我做了,但是在使用split()分割数据后,使用&gt; =和&lt; =运算符来比较start,end和datetime字段。 ; match.col = with(d2[[v]], d1$datetime >= d2.start & d1$datetime <= d2.end)