Создание al oop, которое соответствует интервалу времени для необработанных данных - PullRequest
1 голос
/ 31 января 2020

У меня есть набор данных, который содержит временные метки датчиков Uber в Нью-Йорке. Я хотел бы добавить в таблицу дополнительный столбец, который будет содержать метки времени, отформатированные с 15-минутными интервалами. Например:

Необработанные временные метки:

4/1/2014 21:46:00 4/1/2014 21:47:00

Ожидаемый результат с 15-минутными интервалами:

2014-04-01 21:45:00 UTC--2014-04-01 22:00:00 UTC.

Мне удалось добиться преобразования необработанных временных меток в 15-минутную временную метку, выполнив следующие действия:

library(lubridate)
#formatting Date.Time to POSIXct 
uber1$Date.Time <- format(as.POSIXct(uber1$Date.Time ,format="%m/%d/%Y %H:%M:%S"))
time_int<-seq(ISOdatetime(2014,4,1,0,0,0), ISOdatetime(2014,7,10,0,0,0), by=(60*15))
time_int <- format(as.POSIXct(time_int ,format="%m/%d/%Y %H:%M:%S"))
interval_object <- int_diff(time_int)

Теперь моя проблема заключается в том, что я не могу сопоставить преобразованные временные метки с их исходной временной меткой. Как бы я сопоставил необработанную метку времени с объектом интервала?

1 Ответ

0 голосов
/ 02 февраля 2020

Вы можете создать другой интервал с датой и временем в вашем фрейме данных и спросить, в какой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...