2015-07-10 12 views
7

Ho stringhe che rappresentano gli offset di tempo, che hanno + e - segni, come ad esempio:Come definire +/- accedere come.difftime in R?

string1 <- c("+00:30", "-07:00")

Come posso convertire questi in formato as.difftime? So che se non ci fossero segni, avrei potuto semplicemente scrivere as.difftime(string1, format = "%H:%M") e funzionerà. Tuttavia, non so come gestire i segni. Voglio utilizzare il risultato difftime per convertire l'ora UTC in LST.

Apprezzo il vostro tempo e il vostro aiuto in anticipo.

+1

Ha, non credo lo faccia (sorprendente)! Dovresti semplicemente togliere il segno e fare un po 'di fancyfooting 'ifelse' /' grep' per attaccare il segno ... –

+0

C'è un 'gmtoff' descritto in' DateTimeClasses' ma non l'ho mai visto letteralmente usato. Quindi non potrei nemmeno fornirti un esempio. –

+0

Grazie, ho usato substr per dividere il segno e i numeri e poi creato il secondo tempo – newbie

risposta

0

È possibile farlo utilizzando as.difftime e format = "%z" ma ci sono un paio di problemi. Innanzitutto, i due punti non sono una parte valida di un identificatore del fuso orario. Secondo, l'output sembra essere relativo al tuo fuso orario corrente. Ecco una funzione che ottiene rotondo quelli:

tz_to_difftime <- function(x, zero = "+0000") { 
    out <- as.difftime(c(zero, gsub("[: ]", "", x)), 
        format = "%z") 
    out[1] - out[-1] 
} 
tz_to_difftime("+05:30") 

Si noti che questo funziona solo per le differenze di fino a 14 ore in corrente R (meno su versioni precedenti).

Ecco un'alternativa usando strsplit:

tz_to_difftime2 <- function(x) { 
    as.difftime(sapply(strsplit(x, ":"), 
    function(x) as.numeric(x) %*% c(1, 1/60)), 
    units = "hours") 
} 

E se vi piacciono le cose più pipey (usando magtittr)

tz_to_difftime3 <- . %>% 
    strsplit(":") %>% 
    sapply(
    . %>% 
    as.numeric %>% 
    multiply_by_matrix(c(1, 1/60)) 
) %>% 
    as.difftime(unit = "hours") 

Questi ultimi due hanno il vantaggio che si prenderanno tutto il numero di ore .

+0

Questa è la soluzione corta presa in prestito da un'altra pagina come.difftime (gsub ("[+ -]", "", x), format = "% H:% M") * ifelse (grepl ("^ -", x), - 1,1) – newbie

+0

@newbie Ho pensato che avresti fatto qualcosa del genere, ma ho pensato che sarebbe stato interessante esplorare alternative –

+0

Grazie, è davvero utile. – newbie

Problemi correlati