2017-09-15 163 views
1

我今天在编程方面不是很有经验,但在过去很远的地方做了一些工作。lubridate - 计算每个间隔的重叠间隔

我们支持共享车,每辆车都有预约开始日期时间和结束日期时间。每个预订的start-dt和end-dt全部为00或30分钟,持续时间> = 30分钟。

现在我们有很多车在同一个地方,我想看看有多少辆车在重叠时间进行预订。

为此,我在两次之间建立一个时间间隔为30分钟的时间序列。

library(dplyr) 
TimeSlot = 
    tibble(seq(
    from = as.POSIXlt("2013-07-01"), 
    to = as.POSIXlt("2013-12-01"), 
    1800)) 
TimeSlot <- cbind(TimeSlot, c(0L)) 
colnames(TimeSlot) <- c("Slot", "count") 
TimeSlot$count <- as.integer(TimeSlot$count) 

然后,对于每个时间段,我会计算与该时间段重叠的预订。此代码的工作原理:

for(j in 1:length(TimeSlot$count)) 
{ 
    for (i in 1:length(bookings$start)) { 
    if ((TimeSlot[j, "Slot"] >= bookings[i, "start"]) && 
     (TimeSlot[j, "Slot"] < bookings[i, "end"])) { 
     TimeSlot[j, "count"] = TimeSlot[j, "count"] + 1 
     # rk_j = j 
    } 
    } 
} 

我得到一个结果。

这需要一段时间,我认为,这不是很像r。现在,在我开始优化这些代码之前,如果有类似r的方式来解决我的问题,我会问更多有经验的人的社区。

问候 Ruediger

+0

我该怎么做? –

+0

你可以检查答案左边的绿色箭头,谢谢! – PoGibas

回答

0

不知道bookings样子怎么不是那么容易,但这个逻辑应该工作。当你用lubridate标记问题时,我发布了解决方案。

library(lubridate) 

# Transform time for Slot using lubridate 
TimeSlot$Slot <- ymd_hms(TimeSlot$Slot) 

# Create example dataset for bookings 
bookings <- data.frame(start = c(TimeSlot$Slot[4], TimeSlot$Slot[12]), 
         end = c(TimeSlot$Slot[10], TimeSlot$Slot[22])) 
# Transform booking to time interval 
bookingsInterval <- interval(bookings$start, bookings$end) 

# For each time slot sum how many overlaps with bookings interval 
TimeSlot$count <- sapply(TimeSlot$Slot, function(x) sum(x %within% bookingsInterval)) 
+0

太好了,谢谢。看起来很有效。我只需要看,如果从2015-10-01 12:00:00到2015-10-01 12:30:00的预订重叠两个插槽或一个。诀窍在于%;-) –

+0

如果元素数量与您想要的不匹配,您可以从预订中扣除一分钟 – PoGibas

+0

这是我的想法。 –