lubridate - 计算每个间隔的重叠间隔

时间:2017-09-15 13:02:19

标签: r lubridate

我今天在编程方面不是很有经验,但在过去做了很多工作。

我们支持共享汽车,每辆车都有预订日期和结束日期时间。 Start-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

1 个答案:

答案 0 :(得分: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))