2009-09-07 7 views
3

Есть ли хороший способ справиться с такими периодами времени, как 05:30 (5 минут, 30 секунд) в R?Работа с периодами времени, такими как 5 минут и 30 секунд в R

Альтернативно, какой самый быстрый способ преобразовать его в целое число всего за несколько секунд?

Я могу преобразовать только даты и не могу найти тип данных для времени.

Я использую R с зоопарком.

Большое спасибо!


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

# time - time in the format of dd hh:mm:ss 
#  (That's the format used in cvs export from Alcatel CCS reports) 
# 
time.to.seconds <- function(time) { 

    t <- strsplit(as.character(time), " |:")[[1]] 
    seconds <- NaN 

    if (length(t) == 1) 
     seconds <- as.numeric(t[1]) 
    else if (length(t) == 2) 
     seconds <- as.numeric(t[1]) * 60 + as.numeric(t[2]) 
    else if (length(t) == 3) 
     seconds <- (as.numeric(t[1]) * 60 * 60 
      + as.numeric(t[2]) * 60 + as.numeric(t[3])) 
    else if (length(t) == 4) 
     seconds <- (as.numeric(t[1]) * 24 * 60 * 60 + 
     as.numeric(t[2]) * 60 * 60 + as.numeric(t[3]) * 60 + 
     as.numeric(t[4])) 

    return(seconds) 
} 

ответ

4

Как Dirk указывает, есть объект, называемый «difftime», но не могут быть добавлены/вычтены.

> as.difftime(5, units="mins") 
Time difference of 5 mins 

> d <- seq(from=as.POSIXct("2003-01-01"), to=as.POSIXct("2003-01-04"), by="days") 
> d 
[1] "2003-01-01 GMT" "2003-01-02 GMT" "2003-01-03 GMT" "2003-01-04 GMT" 

> d + as.difftime(5, units="mins") 
[1] "2003-01-01 00:00:05 GMT" "2003-01-02 00:00:05 GMT" 
[3] "2003-01-03 00:00:05 GMT" "2003-01-04 00:00:05 GMT" 
Warning message: 
Incompatible methods ("+.POSIXt", "Ops.difftime") for "+" 

Кажется, теперь вы можете это сделать:

> as.difftime(5, units='mins') 
    Time difference of 5 mins 
    > d <- seq(from=as.POSIXct("2003-01-01"), to=as.POSIXct("2003-01-04"), by="days") 
    > d 
    [1] "2003-01-01 GMT" "2003-01-02 GMT" "2003-01-03 GMT" "2003-01-04 GMT" 
    > d + as.difftime(5, unit='mins') 
    [1] "2003-01-01 00:05:00 GMT" "2003-01-02 00:05:00 GMT" 
    [3] "2003-01-03 00:05:00 GMT" "2003-01-04 00:05:00 GMT" 
    > d + as.difftime(5, unit='secs') 
    [1] "2003-01-01 00:00:05 GMT" "2003-01-02 00:00:05 GMT" 
    [3] "2003-01-03 00:00:05 GMT" "2003-01-04 00:00:05 GMT" 
    > 

Это с недавно выпущенным R 2.15.0

+2

Да, слабость difftime действительно грустный аспект стандартных библиотек R , – Harlan

7

Да, пока нет типа «времени», вы можете использовать смещение время:

R> now <- Sys.time() 
R> now 
[1] "2009-09-07 08:40:32 CDT" 
R> class(now) 
[1] "POSIXt" "POSIXct" 
R> later <- now + 5*60 
R> later 
[1] "2009-09-07 08:45:32 CDT" 
R> class(later) 
[1] "POSIXt" "POSIXct" 
R> tdelta <- difftime(later, now) 
R> tdelta 
Time difference of 5 mins 
R> class(tdelta) 
[1] "difftime" 
R> 

При использовании zoo пакета, вы используете стандартные POSIXt типов для времен индексов. Как зоопарк, так и новый, а также очень рекомендуемый пакет xts могут использовать POSIXt, и особенно компактный тип POSIXct, для индексации.

Пакета XTS имеет гораздо больше функциональные возможности индексирования, и Джефф недавно добавил синтаксические интервалы в соответствии с ISO8601-2004 (е) спецификации и дает эти ссылки для ISO8601 и FAQ for widely used standars for date and time formats. Для того, чтобы использовать эту XTS версию, возможно, потребуется переключить xts development snapshot on r-forge

[Edit:] Кроме того, в отношении вопроса о «преобразовании»: это легко, как только у вас есть объекты класса POSIXt/POSIXct, как as.numeric() будет конвертировать POSIXct в (дробные) секунды с эпохи. R идет дальше, чем стандарт POSIX и использует двойной здесь, так что вы получите миллисекунды точность:

R> options("digits.secs"=6) ## needed so that fractional seconds are printed 
R> now <- Sys.time(); difftime(Sys.time(), now) 
Time difference of 0.000149 secs 

и

R> print(as.numeric(now), digits=15) ## print with digits for sub-second time 
[1] 1252374404.22975 
R>