В R используйте lubridate для преобразования объектов hms в секунды

простой вопрос в смазке - я хочу преобразовать объект hms в соответствующее количество секунд с начала дня.

Например

library(lubridate)
hms("12:34:45")

то я хочу точно знать, сколько 12 часов, 34 минуты и 45 секунд, в секундах

что-то очевидное, как

seconds(hms("12:34:45"))

просто возвращается

45s

чего я не хочу. Как преобразовать эти значения hms в секунды? Я хотел бы использовать смазку


person tomw    schedule 02.07.2012    source источник
comment
as.duration() возможно?   -  person joran    schedule 02.07.2012


Ответы (2)


Неважно, какой пакет вы используете — он преобразует объект даты/даты и времени в представление POSIXct секунд с начала эпохи. Таким образом, вы также можете сделать это в базе R — поэтому здесь разверните ISOdatetime() с произвольным днем, используя сегодня:

R> difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,2,0,0,0))
Time difference of 12.5792 hours

Итак, нам нужны секунды:

R> difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,2,0,0,0), 
+          unit="secs")
Time difference of 45285 secs

И мы можем привести к числам:

R> as.numeric(difftime(ISOdatetime(2012,7,2,12,34,45), +
                       ISOdatetime(2012,7,2,0,0,0), unit="secs"))
[1] 45285

Редактировать: Возвращаясь к смазке, возможно, это ошибка:

> hms("12:34:45") - hms("00:00:00")
[1] 12 hours, 34 minutes and 45 seconds
R> as.numeric(hms("12:34:45") - hms("00:00:00"))
[1] 45
R>
person Dirk Eddelbuettel    schedule 02.07.2012
comment
Да, это будет точнее, чем просто as.duration, которое (я думаю) просто преобразует каждую часть в количество секунд по умолчанию. В lubridate вам нужно сначала преобразовать его в интервал, что, я думаю, в основном то, что вы делаете здесь. - person joran; 02.07.2012
comment
lubridate не изобретает новые типы времени, поэтому предложенный вами as.duration() вполне может работать, или, может быть, разница с hms(00:00:00) или... - person Dirk Eddelbuettel; 02.07.2012
comment
Опоздал на вечеринку, но решил добавить: out <- as.POSIXct("12:34:45", format="%H:%M:%S",tz="UTC"); difftime(out,trunc(out,"day"),units="secs") - person thelatemail; 07.08.2015

R>lubridate::period_to_seconds(hms("01:00:00")) 

дает ожидаемые 3600 секунд в виде числового отсчета с 00:00:00 или в случае выше:

R>period_to_seconds(hms("12:34:45")) 
person Steven Varga    schedule 09.12.2012