Разделите два разных времени

У меня три раза (POSIXct) объекты t1, t2, t3 которые определяют продолжительность времени для выполнения задачи.

я нашел t1, t2, t3 сделав следующее:

t1 <- as.POSIXct("2016-10-30 13:53:34") - as.POSIXct("2016-10-30 13:35:34")
t2 <- as.POSIXct("2016-10-30 14:53:34") - as.POSIXct("2016-10-30 14:35:34")
t3 <- as.POSIXct("2016-10-30 15:50:34") - as.POSIXct("2016-10-30 15:40:34")

Я хочу найти отношения t1/t3 а также t2/t3, Однако я получаю следующую ошибку:

t1/t3
# Error in `/.difftime`(t1, t3) : 
#   second argument of / cannot be a "difftime" object

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

3 ответа

Решение

Разделить на difftime Вы должны преобразовать его в числовой. Если, как вы указали в комментарии, вы хотите, чтобы ответ выражался в секундах, вы можете указать 'secs' единицы. Например:

t1/as.double(t3, units='secs')

Как отмечает @JonathanLisic, as.double как правило, не берет units параметр, и это не будет работать для общих классов времени. Это S3 метод для difftime который принимает параметр.

На сегодняшний день (9/2018) вы можете использовать as.numeric() повернуть difftime значения в числовые значения. то есть, если вы должны были взять

as.numeric(t3)

R вернет 10 по желанию.

Ответ @MatthewLundberg является более правильным, но я предложу альтернативу, чтобы помочь проиллюстрировать основные структуры основанных на времени объектов в R, которые всегда являются числами:

unclass(t1)/unclass(t3)
# [1] 1.8
# attr(,"units")
# [1] "mins"

Обратите внимание, что с точки зрения единиц, подход t1/as.double(t3, units = 'secs') не имеет особого смысла, так как единицы вывода - мин / с, тогда как этот ответ не содержит единиц измерения.

Обратите внимание, что этот подход немного опасен, так как по умолчанию -.POSIXt (который в конечном итоге называется, когда вы определяете t1, t2, а также t3) автоматически выбирает единицы вывода (по ядру, -.POSIXt здесь позвонят difftime по умолчанию units = "auto"). В этом случае нам (возможно) повезло, что всем 3 даны единицы, но рассмотрим t4:

t4 = as.POSIXct('2017-10-21 12:00:35') - as.POSIXct('2017-10-21 12:00:00')
t4
# Time difference of 35 secs

Опять же, если мы используем t4 в соотношении, мы, вероятно, получим неправильные единицы.

Мы можем избежать этого, явно вызвав difftime и объявив единицы заранее:

t1 = difftime("2016-10-30 13:53:34", "2016-10-30 13:35:34", units = 'mins')
t2 = difftime("2016-10-30 14:53:34", "2016-10-30 14:35:34", units = 'mins')
t3 = difftime("2016-10-30 15:50:34", "2016-10-30 15:40:34", units = 'mins')
t4 = difftime('2017-10-21 12:00:35', '2017-10-21 12:00:00', units = 'mins')
t4
# Time difference of 0.5833333 mins
Другие вопросы по тегам