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()

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.


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

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"))

12

Puede utilizar format:

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

¿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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.