Вы можете создать другой интервал с датой и временем в вашем фрейме данных и спросить, в какой 15-минутный интервал он попадает:
library(lubridate)
set.seed(100)
uber1 = data.frame(
Date.Time = ISOdatetime(2014,4,1,0,0,0)+70*86400*runif(100)
)
uber1$Date.Time <- format(as.POSIXct(uber1$Date.Time ,format="%m/%d/%Y %H:%M:%S"))
idx = sapply(interval(uber1$Date.Time,uber1$Date.Time),
function(i)which(i %within% interval_object)[1])
uber1$matching_interval = interval_object[idx]
Date.Time matching_interval
1 2014-04-22 13:02:49 2014-04-22 13:00:00 UTC--2014-04-22 13:15:00 UTC
2 2014-04-19 00:53:23 2014-04-19 00:45:00 UTC--2014-04-19 01:00:00 UTC
3 2014-05-09 15:54:06 2014-05-09 15:45:00 UTC--2014-05-09 16:00:00 UTC
4 2014-04-04 22:43:25 2014-04-04 22:30:00 UTC--2014-04-04 22:45:00 UTC
5 2014-05-03 19:09:46 2014-05-03 19:00:00 UTC--2014-05-03 19:15:00 UTC
6 2014-05-04 20:44:05 2014-05-04 20:30:00 UTC--2014-05-04 20:45:00 UTC
Вышеуказанное медленно, когда у вас большой data.frame и много интервалов , Лучший способ - сократить это сразу:
# a function to include start and end of period, and spacing
cut_func = function(tid,start,end,len){
return(cut(c(start,tid,end),len)[-c(1,length(tid)+1)])
}
set.seed(100)
uber1 = data.frame(
Date.Time = ISOdatetime(2014,4,1,0,0,0)+70*86400*runif(100)
)
uber1$interval = cut_func(
uber1$Date.Time,
start=ISOdatetime(2014,4,1,0,0,0),
end=ISOdatetime(2017,4,1,0,0,0),
len="15 min")
И это дает вам начало 15-минутного интервала времени, когда ваш фрейм данных соответствует:
Date.Time interval
1 2014-04-22 13:02:49 2014-04-22 13:00:00
2 2014-04-19 00:53:23 2014-04-19 00:45:00
3 2014-05-09 15:54:06 2014-05-09 15:45:00
4 2014-04-04 22:43:25 2014-04-04 22:30:00
5 2014-05-03 19:09:46 2014-05-03 19:00:00
6 2014-05-04 20:44:05 2014-05-04 20:30:00