2011-07-01 8 views
12

Me han dado un csv con una columna llamada month como una variable char con las primeras tres letras del mes. Ej .:Convertir meses mmm a numérico

"Jan", "Feb","Mar",..."Dec" 

¿Hay alguna manera de convertir esto en una representación numérica del mes, del 1 al 12, o incluso un tipo que está en un formato de fecha?

+2

Crédito adicional: dar una respuesta que funciona si sus abreviaturas mes no están en Inglés! (por ejemplo, "Jan", "Fev", "Mar", "Avr", "Mai", ...) [Sugerencia: probablemente puedas hacer esto cambiando temporalmente la configuración regional de tu sistema y usando 'as.Date' con' % b' format ...] –

Respuesta

31

Uso match y el vector predefinido month.abb:

tst <- c("Jan","Mar","Dec") 
match(tst,month.abb) 
[1] 1 3 12 
13

Puede utilizar la incorporada en el vector month.abb para comprobar contra al convertir a un número, por ejemplo:

mm <- c("Jan","Dec","jan","Mar","Apr") 

sapply(mm,function(x) grep(paste("(?i)",x,sep=""),month.abb)) 
Jan Dec jan Mar Apr 
    1 12 1 3 4 

El constructo grep toma cuidado de las diferencias en capitalización. Si eso no es necesario,

match(mm,month.abb) 

funciona igual de bien.

Si también tiene un día y la columna de un año, puede utilizar cualquiera de las funciones de conversión, utilizando los códigos apropiados (véase también ?strftime)

por ejemplo

mm <- c("Jan","Dec","jan","Mar","Apr") 
year <- c(1998,1998,1999,1999,1999) 
day <- c(4,10,3,16,25) 

dates <- paste(year,mm,day,sep="-") 

strptime(dates,format="%Y-%b-%d") 
[1] "1998-01-04" "1998-12-10" "1999-01-03" "1999-03-16" "1999-04-25" 
+0

Gracias Joris, esto también es útil. Tendré que pegar la columna para obtener una fecha real para una serie temporal. – John

2

Un par de opciones usando :

vec <- c("Jan","Dec","Jan","Apr") 

son

> Months <- 1:12 
> names(Months) <- month.abb 
> unname(Months[vec]) 
[1] 1 12 1 4 

y/o

> match(vec, month.abb) 
[1] 1 12 1 4 
Cuestiones relacionadas