2013-05-09 10 views
5

Come si può convertire "1330" in o "133000" in "13:30:00"? In sostanza, voglio inserire un punto tra ogni coppia di numeri. Sto cercando di convertire i personaggi in momenti.Separare le stringhe in gruppi di 2 caratteri separati da due punti (da 1330 a 13:30) in R

Sembra che ci dovrebbe essere un modo davvero elegante per farlo, ma non riesco a pensarci. Stavo pensando di usare una combinazione di paste() e substr(), ma mi sfugge una soluzione elegante.

EDIT: esempio stringa che deve essere convertito:

X <- c("120000", "120500", "121000", "121500", "122000", "122500", "123000") #example of noon to 12:30pm 
+0

Potete fornire il codice riproducibile per creare i dati che stai guardando? –

+1

as.POSIXct farà ciò che desideri, utilizzando il formato corretto. – hd1

risposta

8

Questo sostituisce ogni sequenza di due caratteri non seguito da un confine con quegli stessi caratteri seguiti da due punti:

gsub("(..)\\B", "\\1:", X) 

Sulla stringa di esempio fornisce:

[1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00" 
+0

Wow, questa è anche una bella risposta. Sto imparando molto su 'regex()' dalla risposta che sto facendo a questa domanda. Ho appena trascorso circa 10 minuti a leggere attraverso? Regex, e ho deciso che non posso dire quale risposta è più solida, questa o quella pubblicata da @flodel (non ho ancora molta familiarità con le espressioni regolari). Sembra che entrambe le risposte siano grandiose. – rbatt

+0

Bello, non sapevo che 'b' si riferiva ai confini! – jbaums

3

Utilizzando substring:

test <- "1330" 
paste(substring(test,seq(1,nchar(test)-1,2),seq(2,nchar(test),2)),collapse=":") 

#[1] "13:30" 


test <- "133000" 
paste(substring(test,seq(1,nchar(test)-1,2),seq(2,nchar(test),2)),collapse=":") 

#[1] "13:30:00" 

Oppure, se si vuole una rappresentazione tempo effettivo che si poteva fare:

test <- "1330" 
as.POSIXct(test,format="%H%M") 
#[1] "2013-05-09 13:30:00 EST" 

Quale è possibile riformattare come:

format(as.POSIXct(test,format="%H%M"),"%H:%M") 
#[1] "13:30" 
+0

+1 per cercare l'applicazione pratica e suggerire POSIXct, ma il suggerimento di gsub() è una soluzione più generale. Grazie! – rbatt

8

È possibile utilizzare un'espressione regolare con un positive lookahead:

gsub("(\\d{2})(?=\\d{2})", "\\1:", X, perl = TRUE) 
# [1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00" 
+0

Ottima risposta, grazie mille! – rbatt

1

Ca n farlo con strptime in un unico passaggio:

strptime(X, format="%H%M%S") 
[1] "2013-05-08 12:00:00" "2013-05-08 12:05:00" "2013-05-08 12:10:00" "2013-05-08 12:15:00" "2013-05-08 12:20:00" 
[6] "2013-05-08 12:25:00" "2013-05-08 12:30:00" 

Dopo la denuncia sulle date di oggetti data-ora, si può sopprimere quella realtà "artificiale" con:

strftime(strptime(X, format="%H%M%S"), "%H:%M:%S") 
[1] "12:00:00" "12:05:00" "12:10:00" "12:15:00" "12:20:00" "12:25:00" "12:30:00" 
+0

Aggiunge un componente mese + giorno artificiale all'output. – rbatt

+0

Hai detto di volere "tempi", giusto? –

+0

Haha, eccoci. – rbatt

Problemi correlati