Установить единицы разницы между объектами даты и времени - PullRequest
10 голосов
/ 22 марта 2011

Команда diff возвращает разницу между датами в векторе дат в формате даты R. Я хотел бы контролировать единицы, которые возвращаются, но кажется, что они определяются автоматически, без возможности управления этим без аргумента. Вот пример:

 > t = Sys.time() 
 > diff(c(t, t + 1))
 Time difference of 1 secs

И еще:

> diff(c(t, t+10000))
Time difference of 1.157407 days

Объект "дельта времени" имеет атрибут единиц, но кажется глупым писать кучу условных выражений, приводящих все в дни, секунды и т. Д.

Ответы [ 5 ]

12 голосов
/ 22 марта 2011

Я не уверен, что вы подразумеваете под "кучей условных выражений", просто измените единицы вручную.

> t = Sys.time()
> a <- diff(c(t,t+1))
> b <- diff(c(t, t+10000))
> units(a) <- "mins"
> units(b) <- "mins"
> a
Time difference of 0.01666667 mins
> b
Time difference of 166.6667 mins

См. ?difftime.Если вам нужно только использовать diff, чтобы получить разницу между двумя значениями (а не более длинным вектором), то, как предлагает Дирк, используйте функцию difftime с параметром units.

9 голосов
/ 22 марта 2011
Тип

A POSIXct (который вы создали, вызвав Sys.time()) всегда используют доли секунды с начала эпохи.

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

R> difftime(t+ 10000,t,unit="secs")
Time difference of 10000 secs
R> difftime(t+ 10000,t,unit="days")
Time difference of 0.115741 days
R> 
6 голосов
/ 22 марта 2011

Я думаю, вам нужно difftime, в котором вы можете указать нужные единицы.Смотри:

> difftime(Sys.time(), Sys.time()+10000)
Time difference of -2.777778 hours

> difftime(Sys.time(), Sys.time()+10000, units="secs")
Time difference of -10000 secs
2 голосов
/ 23 марта 2011

Не знаю, насколько точно вы хотите быть точным, но вы можете очень точно определить дату и время с помощью пакета lubridate. Что удивительно в единицах времени, так это то, что их продолжительность зависит от того, когда они происходят из-за високосных секунд, високосных дней и других условностей.

После загрузки lubridate вычитание даты и времени автоматически создает объект временного интервала.

library(lubridate)
int <- Sys.time() - (Sys.time() + 10000) 

Затем вы можете изменить его на продолжительность, которая измеряет точную продолжительность времени. Длительности отображаются в секундах, потому что секунды являются единственной единицей, которая имеет одинаковую длину. Если вы хотите, чтобы ваш ответ был в определенной единице, просто поделите на длительность объекта, длина которого равна одной из этих единиц.

as.duration(int)
int / dseconds(1)
int / ddays(1)
int / dminutes(5) #to use "5 minutes" as a unit

Или вы можете просто изменить int на точку. В отличие от длительностей, периоды не имеют точной и последовательной длины. Но они точно показывают время на часах. Вы можете делать математику, добавляя и вычитая периоды и длительности к дате и времени.

as.period(int)
Sys.time() + dseconds(5) + dhours(2) - ddays(1)
Sys.time() + hours(2) + months(5) - weeks(1) #these are periods
1 голос
/ 04 ноября 2015

Если вам нужно использовать функцию diff () (например, как я делаю внутри функции ddply), вы также можете преобразовать входные данные в числовой формат, чтобы всегда получать различия в секундах, например:

> t = Sys.time() 
> diff(as.numeric(c(t, t+1)))
[1] 1
> diff(as.numeric(c(t, t+10000)))
[1] 10000

С этого момента вы можете использовать разностные секунды для вычисления различий в других единицах.

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