Extraer año de fecha

82

¿Cómo puedo eliminar los primeros elementos de una variable, especialmente si esta variable tiene caracteres especiales? Por ejemplo, tengo la siguiente columna:

Date
01/01/2009
01/01/2010
01/01/2011
01/01/2012

Necesito tener una nueva columna como la siguiente:

Date
2009
2010
2011
2012
hbtf.1046
fuente
13
Convierta a la clase 'Fecha' y utilícelo formatpara extraer el 'año'
Akrun
5
ogsub(".*/","",df$Date)
mtoto
2
osubstr(as.character(....), 7, 10)
jogo
6
lubridate::yeartambién debería hacer el truco una vez que los datos estén en formato 'Fecha' como lo sugiere @akrun.
fdetsch
6
La solución más limpia es coaccionar esa variable Datey usar una formatu otras funciones para extraer partes de ella. Por ejemplo x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x),.
Roman Luštrik

Respuestas:

20

si todas sus fechas tienen el mismo ancho, puede poner las fechas en un vector y usar la subcadena

Date
a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
substring(a,7,10) #This takes string and only keeps the characters beginning in position 7 to position 10

salida

[1] "2009" "2010" "2011"
Alejandro
fuente
Estoy de acuerdo, pero puedes transformarlo fácilmente en un vector numérico, ¿no? as.numeric(substring(a,7,10))
Fabian Habersack
3
Las fechas no deben convertirse en cadenas o números; son inherentemente un 'número de x (segundos) desde un punto de tiempo fijo' y se muestran como cadenas legibles por humanos, estrictamente para no manipularlas como cadenas.
skoh
178

Como se discutió en los comentarios, esto se puede lograr convirtiendo la entrada en Dateformato y extrayendo el año, por ejemplo, así:

format(as.Date(df1$Date, format="%d/%m/%Y"),"%Y")
RHertel
fuente
7
¿Por qué diablos funciona esto? Si miro format()la documentación de, no se dice nada sobre el segundo argumento que proporcionó. ¿Cómo debo entender esto?
Scarface
16
De ?format: "formato es una función genérica . Aparte de los métodos descritos aquí, hay métodos para fechas ( ver formato.Date )". From ?format.Date: "## Método S3 para el formato de clase 'Date' (x, ...) [donde ... denota] más argumentos que se pasarán desde o hacia otros métodos, incluido el formato para los métodos as.character y as.Date . ". Vea también el primer ejemplo en ?format.Date.
RHertel
27

Cuando convierte su variable a Date:

date <-  as.Date('10/30/2018','%m/%d/%Y')

luego puede recortar los elementos que desee y crear nuevas variables, como año:

year <- as.numeric(format(date,'%Y'))

o mes:

month <- as.numeric(format(date,'%m'))
invictus
fuente
4

Si está utilizando el datepaquete , esto se puede hacer con bastante facilidad.

library(date)
Date <- c("01/01/2009", "01/01/2010", "01/01/2011", "01/01/2012")
Date <- as.date(Date)
Date
# [1] 1Jan2009 1Jan2010 1Jan2011 1Jan2012
date.mdy(Date)$year
# [1] 2009 2010 2011 2012

## be aware that these are now integers and thus different methods may be invoked:
str(date.mdy(Date)$year)
# int [1:4] 2009 2010 2011 2012
summary(Date)
#     First      Last   
# "1Jan2009" "1Jan2012" 
summary(date.mdy(Date)$year)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#    2009    2010    2010    2010    2011    2012 
gung - Restablecer a Monica
fuente
3

Este es más un consejo que una respuesta específica, pero mi sugerencia es convertir las fechas en variables de fecha inmediatamente, en lugar de mantenerlas como cadenas. De esta manera, puede usar funciones de fecha (y hora) en ellos, en lugar de intentar usar soluciones muy problemáticas.

Como se señaló, el paquete lubridate tiene buenas funciones de extracción.

Para algunos proyectos, he descubierto que unir las fechas desde el principio es útil: cree variables de año, mes, día (del mes) y día (de la semana) para comenzar. Esto puede simplificar resúmenes, tablas y gráficos, porque el código de extracción está separado del código de resumen / tabla / gráfico, y porque si necesita cambiarlo, no tiene que implementar esos cambios en varios puntos.

Barry DeCicco
fuente
0

Desde hace algún tiempo, también puede confiar únicamente en el data.tablepaquete y su IDateclase más las funciones asociadas (Verificar ?as.IDate()). Por lo tanto, no es necesario instalarlo adicionalmente lubridate.

require(data.table)

a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
year(as.IDate(a, '%d/%m/%Y')) # all data.table functions
andschar
fuente