2015-06-26 15 views
6

Ho creato una funzione che costringe un vettore di formato trimestrali a un vettore di date.Converti formato trimestre/anno in data

.quarter_to_date(c("Q1/13","Q2/14")) 
[1] "2013-03-01" "2014-06-01" 

Questo è il codice della mia funzione.

.quarter_to_date <- 
    function(x){ 
    ll <- strsplit(gsub('Q([0-9])[/]([0-9]+)','\\1,\\2',x),',') 

    res <- lapply(ll,function(x){ 
     m <- as.numeric(x[1])*3 
     m <- ifelse(nchar(m)==1,paste0('0',m),as.character(m)) 
     as.Date(paste(x[2],m,'01',sep='-'),format='%y-%m-%d') 

    }) 
    do.call(c,res) 
    } 

La mia funzione funziona bene ma sembra lunga e un po 'complicata. Penso che questo dovrebbe essere già fatto in altri pacchetti (lubridate per esempio) Ma non riesco a trovarlo. Qualcuno può aiutarmi a semplificare questo codice, per favore?

risposta

11

1) Il pacchetto zoo ha una classe "yearqtr". Convertire a quella e poi a "Date" classe:

library(zoo) 
x <- c("Q1/13","Q2/14") 

as.Date(as.yearqtr(x, format = "Q%q/%y")) 
## [1] "2013-01-01" "2014-04-01" 

2) Questo funziona anche per ottenere l'ultimo giorno del mese, invece del primo:

as.Date(as.yearqtr(x, format = "Q%q/%y"), frac = 1) 
## [1] "2013-03-31" "2014-06-30" 

3) non prendere in considerazione anche la conversione alla classe e l'utilizzo della classe "yearqtr" direttamente:

as.yearqtr(x, format = "Q%q/%y") 
## [1] "2013 Q1" "2014 Q2"