Как найти разницу во времени между двумя столбцами даты / времени из фрейма данных - PullRequest
0 голосов
/ 05 июня 2018

У меня есть фрейм данных, как показано ниже,

S.no          f_req_time         f_drop_time
1    2016-07-11 06:04:00   2016-07-11 06:44:00
2    2016-07-11 12:20:00   2016-07-11 13:10:00
3    2016-07-11 16:19:00   2016-07-11 17:25:00
4    2016-07-12 09:03:00   2016-07-12 09:58:00
5    2016-07-12 12:10:00   2016-07-12 12:49:00

Я хочу добавить столбец с именем время ожидания, это будет разница во времени 1-го значения столбца 'f_drop_time' (2016-07 гг.-11 06:44:00) т.е. первое значение S.no.1 и второе значение т.е. из S.no.2 для f_req_time (2016-07-11 12:20:00). Как я могу сделатьстолбец всех различий во времени. Я попытался for loop.it возвращает все ноль.

столбец даты и времени в формате POSIXct

мой код,

funtion<-for (i in 1:nrow(driver_27)) {
  driver_27$wait <- driver_27$f_drop_time[i+1]-driver_27$f_req_time[i]
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это решение смещает f_drop_time и сохраняет в новом столбце для облегчения проверки / проверки.Он также использует lubridate::interval() для расчета времени ожидания в часах:

# data
data.frame(
  f_req_time = c("2016-07-11 06:04:00" , "2016-07-11 12:20:00", "2016-07-11 16:19:00", "2016-07-12 09:03:00", "2016-07-12 12:10:00"),
  f_drop_time = c("2016-07-11 06:44:00", "2016-07-11 13:10:00", "2016-07-11 17:25:00", "2016-07-12 09:58:00", "2016-07-12 12:49:00"),
  stringsAsFactors = FALSE
) -> x

# create a new column that has ofset f_drop_time by 1
x %>% mutate(temp = c(f_drop_time[-1], NA)) -> x

# convert to lubridate format
ymd_hms(x$temp) -> x$temp
ymd_hms(x$f_drop_time) -> x$f_drop_time

# calculates the interval in hours in 'wait_time' column
(x %>% mutate(wait_time = interval(f_drop_time, temp)/hours(1)) -> x)

# removes temp
x[, !names(x) %in% c("temp")] -> x

производит (с временными данными):

           f_req_time         f_drop_time                temp wait_time
1 2016-07-11 06:04:00 2016-07-11 06:44:00 2016-07-11 13:10:00  6.433333
2 2016-07-11 12:20:00 2016-07-11 13:10:00 2016-07-11 17:25:00  4.250000
3 2016-07-11 16:19:00 2016-07-11 17:25:00 2016-07-12 09:58:00 16.550000
4 2016-07-12 09:03:00 2016-07-12 09:58:00 2016-07-12 12:49:00  2.850000
5 2016-07-12 12:10:00 2016-07-12 12:49:00                <NA>        NA
0 голосов
/ 05 июня 2018

Мы можем взять lead первого столбца и использовать difftime для выполнения вычитания (обратите внимание, что не совсем понятно, что такое unit)

driver_27$wait <- with(driver_27, as.numeric(difftime(c(f_req_time[-1], NA),
                     f_drop_time, unit = 'hour')))
driver_27$wait
#[1]  5.60000  3.15000 15.63333  2.20000       NA

данных

driver_27 <- structure(list(S.no = 1:5, f_req_time = structure(c(1468231440, 
1468254000, 1468268340, 1468328580, 1468339800), class = c("POSIXct", 
"POSIXt"), tzone = ""), f_drop_time = structure(c(1468233840, 
1468257000, 1468272300, 1468331880, 1468342140), class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("S.no", "f_req_time", "f_drop_time"
), row.names = c(NA, -5L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...