Difftime () между временными интервалами? (Р) - PullRequest
0 голосов
/ 16 марта 2020

Я хочу знать, возможно ли рассчитать разницу во времени между двумя временными интервалами в R.

С отдельными датами я знаю, что могу использовать функцию difftime ().

И я знаю, что я могу использовать функцию int_overlaps () из пакета lubridate, чтобы узнать, перекрывают ли два интервала друг друга (он обеспечивает вывод TRUE / FALSE).

Теперь вместо выход TRUE / FALSE, есть ли функция, которая может дать мне разницу во времени между двумя интервалами? Если они перекрывают друг друга, выходное значение будет равно 0. А если нет, выходным значением будет разница во времени между наиболее проксимальными границами каждого интервала.

Пример.


int1 = 2020-03-10 11:00:00--2020-03-10 14:00:00

int2 = 2020-03-10 12:00:00--2020-03-10 13:00:00

int3 = 2020-03-10 08:00:00--2020-03-10 11:30:00

Функция выхода:

int1 and int2 -> 0

int1 and int3 -> 0

int2 and int3 -> 0.5 hours

1 Ответ

0 голосов
/ 16 марта 2020

Вы можете написать собственную короткую функцию с желаемыми выходами.

Во-первых, получите функцию для проверки наложения с использованием int_overlaps, а если TRUE, верните 0 секунд с помощью make_difftime(0).

Если наложения нет, вы можете сделать используйте int_start и int_end из пакета lubridate, чтобы получить начало и конец двух ваших интервалов, которые вы затем сравниваете с difftime.

Для полноты целесообразно добавить несколько проверка ошибок, чтобы убедиться, что оба входа являются объектами с одним интервалом:

library(lubridate)

interval_difftime <- function(a, b)
{
  stopifnot(is.interval(a) & is.interval(b) & length(a) == 1 & length(b) == 1)

  if (int_overlaps(a, b)) return(make_difftime(0))
  if (int_end(a) < int_start(b)) return(-difftime(int_start(b), int_end(a)))
  else return(difftime(int_start(a), int_end(b)))
}

Порядок будет работать так же, как и difftime, в том случае, если вы сначала установите более поздний интервал, вы получите положительную разницу , но если вы поставите предыдущее первым, это даст отрицательную разницу.

Предположим, у меня есть следующие интервалы x, y и z:

n <- now()
x <- interval(n, n + 5)
y <- interval(n + 3, n + 8)
z <- interval(n + 6, n + 10)

Затем следующие тесты дают желаемые результаты: разница во времени равна нулю, если интервалы перекрываются; в противном случае разница между проксимальными концами интервалов в соответствии с порядком:

interval_difftime(x, y)
#> Time difference of 0 secs
interval_difftime(x, z)
#> Time difference of -1 secs
interval_difftime(z, x)
#> Time difference of 1 secs

Создано в 2020-03-16 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...