2012-03-17 13 views

Respuesta

134

utilizar el método de format() de objetos de la clase "yearmon". Aquí es su fecha de ejemplo (creado correctamente!)

date1 <- as.yearmon("Mar 2012", "%b %Y") 

entonces podemos extraer las partes de la fecha según sea necesario:

> format(date1, "%b") ## Month, char, abbreviated 
[1] "Mar" 
> format(date1, "%Y") ## Year with century 
[1] "2012" 
> format(date1, "%m") ## numeric month 
[1] "03" 

Estos son devueltos como caracteres. Cuando corresponda, envuelva en as.numeric() si quiere el año o el mes numérico como una variable numérica, p.

> as.numeric(format(date1, "%m")) 
[1] 3 
> as.numeric(format(date1, "%Y")) 
[1] 2012 

Ver ?yearmon y ?strftime para los detalles - el último explica los caracteres de marcador de posición que puede utilizar.

+4

% B para el mes completo, es decir, marzo "en lugar" de "Mar" – PatrickT

+0

¿Cómo haré eso si tuviera un 'vector' de n elementos, digamos 1k fechas en un' vector'? – Stophface

+0

@Chrissl gusta mucho de R, 'date1' también puede ser un vector de fechas. –

11

Puede utilizar format:

library(zoo) 
x <- as.yearmon(Sys.time()) 
format(x,"%b") 
[1] "Mar" 
format(x,"%Y") 
[1] "2012" 
+0

¿Cómo puedo hacer que el mes sea un número? (por ejemplo, 3 para Mar?) –

+1

@ user1169210 'formato (x,"% m ")' – James

+0

@ user1169210 Cubrí esto en mi respuesta. Desea 'as.numeric (formato (x,"% m "))' para el mes como un valor numérico, por ejemplo. –

97

El lubridate package es increíble para este tipo de cosas:

> require(lubridate) 
> month(date1) 
[1] 3 
> year(date1) 
[1] 2012 
+2

Ha gracias por esta respuesta. Sobre todo supera a las otras soluciones cuando desea hacer algo como if (year (date1)> 2014) {year (date1) <- year (date1) - 100} – Vincent

+1

esto fue definitivamente la mejor respuesta para mis requisitos de tomar el año de las fechas de inicio de 4000 contratos. – d8aninja

+0

@Ari B. Friedman actualmente estoy usando R 3.1.0 mientras que esto no soporta el paquete 'lubridate' y traté de instalar este y el año usado (fecha) pero da el día en lugar del año ¿esto solo funciona en las fechas cuyo formato es "2015-05-06"? – KRU

15

Sé el PO está utilizando zoo aquí, pero me encontré con este hilo de google para una solución estándar ts por el mismo problema. Así que pensé que agregaría una respuesta libre de zoo para ts también.

# create an example Date 
date_1 <- as.Date("1990-01-01") 
# extract year 
as.numeric(format(date_1, "%Y")) 
# extract month 
as.numeric(format(date_1, "%m")) 
5

Para grandes vectores:

y = as.POSIXlt(date1)$year + 1900 # x$year : years since 1900 
m = as.POSIXlt(date1)$mon + 1  # x$mon : 0–11 
+1

Esta es la mejor respuesta, ya que R ya proporciona el práctico objeto 'POSIXlt' que hace innecesario el paquete de zoológico –

0

La pregunta no ha precisado por lo que la producción se espera pero suponiendo que para el mes que desea que el número de meses (enero = 1) y para el año que desea que el año numérico de 4 dígitos y luego suponiendo que acabamos de ejecutar el código en la pregunta:

cycle(date1) 
## [1] 3 
as.integer(date1) 
## [1] 2012 
Cuestiones relacionadas