Extraer mes y año de un zoológico :: objeto yearmon

112

Tengo un yearmonobjeto:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

¿Cómo puedo extraer el mes y el año de esto?

month1 <- fn(date1)
year1 <- fn(date1)

¿Qué función debo usar en lugar de fn()

Adán 888
fuente

Respuestas:

143

Usa el format()método para objetos de clase "yearmon". Aquí está su fecha de ejemplo (¡creada correctamente!)

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

Luego, 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 se devuelven como caracteres. Cuando corresponda, ingrese as.numeric()si desea el año o el mes numérico como variable numérica, p. Ej.

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

Consulte ?yearmony ?strftimepara obtener más detalles: este último explica los caracteres de marcador de posición que puede usar.

Gavin Simpson
fuente
4
% B para el mes completo, es decir, marzo "en lugar" de "marzo"
PatrickT
¿Cómo haría eso si tuviera uno vectorde n elementos, digamos 1k fechas en uno vector?
Stophface
@Chrissl como gran parte de R, también date1puede ser un vector de fechas.
Gavin Simpson
101

El paquete lubridate es asombroso para este tipo de cosas:

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012
Ari B. Friedman
fuente
2
Gracias por esta respuesta. Especialmente supera a las otras soluciones cuando desea hacer algo como if (año (fecha1)> 2014) {año (fecha1) <- año (fecha1) - 100}
Vincent
1
Esta fue definitivamente la mejor respuesta para mis requisitos de eliminar la parte anual de las fechas de inicio de 4000 contratos.
d8aninja
@Ari B. Friedman Actualmente estoy usando R 3.1.0 mientras que este lubridatepaquete no soporta e intenté instalar este y usé año (fecha) pero da el día en lugar del año ¿Esto solo funciona en fechas cuyo formato es "2015-05 -06 "?
KRU
1
@KRU Las nuevas versiones de R a veces demoran algunas semanas para que los repositorios actualicen todos los paquetes. Debería funcionar en todos los formatos de fecha siempre que sea un formato de fecha real, no un vector de caracteres. Publique una nueva q si eso aún no resuelve su problema y no puede buscar SO para ninguno de los componentes de su pregunta.
Ari B. Friedman
15

Sé que el OP está usando zooaquí, pero encontré este hilo buscando en Google una tssolución estándar para el mismo problema. Así que pensé en agregar una zoorespuesta gratuita para tstambié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"))
Matt Bannert
fuente
12

Puede utilizar format:

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"
James
fuente
¿Cómo puedo hacer que el mes sea un número? (por ejemplo, 3 para marzo?)
Adam 888
@ user1169210 Cubrí esto en mi respuesta. Quiere as.numeric(format(x, "%m"))el mes como numérico, por ejemplo.
Gavin Simpson
5

Para vectores grandes:

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11
user3226167
fuente
1
Esta es la mejor respuesta, ya que R ya proporciona el POSIXltobjeto útil que hace que el paquete zoológico sea innecesario
Marco Demaio
0

La pregunta no indicó con precisión qué resultado se esperaba, pero suponiendo que para el mes desea el número de mes (enero = 1) y para el año desea el año numérico de 4 dígitos, entonces asumiendo que acabamos de ejecutar el código en la pregunta:

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012
G. Grothendieck
fuente
0

Habiendo tenido un problema similar con los datos desde 1800 hasta ahora, esto funcionó para mí:

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works
anónimo
fuente