2017-09-15 164 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

這是我的想法。 –