Saltar al contenido

Cambio de formato de fecha en R

Este equipo de redactores ha estado mucho tiempo investigando para darle resolución a tus interrogantes, te dejamos la respuestas por eso deseamos que te sea de gran apoyo.

Solución:

Hay dos pasos aquí:

  • Analizar los datos. Su ejemplo no es completamente reproducible, ¿los datos están en un archivo o la variable en un texto o factor variable? Supongamos lo último, entonces si su data.frame se llama X, puede hacer
 X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")

Ahora el newdate la columna debe ser del tipo Date.

  • Formatee los datos. eso es cuestion de llamar format() o strftime():
 format(X$newdate, "%Y-%m-%d")

Un ejemplo más completo:

R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), 
+                    mid=c(0.8378,0.8457,0.8147))
R> nzd
        date    mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y")
R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d")
R> nzd
        date    mid    newdate    txtdate
1 31/08/2011 0.8378 2011-08-31 2011-08-31
2 31/07/2011 0.8457 2011-07-31 2011-07-31
3 30/06/2011 0.8147 2011-06-30 2011-06-30
R> 

La diferencia entre las columnas tres y cuatro es el tipo: newdate es de clase Date mientras txtdate es personaje

nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")

En el fragmento de código anterior, hay dos errores. En primer lugar, cuando estás leyendo nzd$date en el interior as.Date no está mencionando en qué formato lo está alimentando date. Por lo tanto, prueba su formato predeterminado para leerlo. si ves el help doc, ?as.Date ya verás

formato
Un personaje string. Si no se especifica, intentará "%Y-%m-%d" y luego "%Y/%m/%d" en el primer elemento que no sea NA y generará un error si ninguno funciona. De lo contrario, el procesamiento es a través de strptime

El segundo error es: aunque te gustaría leerlo en %Y-%m-%d formato, dentro format tu escribiste "%Y/%m/%d".

Ahora, la forma correcta de hacerlo es:

> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"), 
+                                       mid=c(0.8378,0.8457,0.8147))
> nzd
        date    mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
> nzd$date <- format(as.Date(nzd$date, format = "%d/%m/%Y"), "%Y-%m-%d")
> head(nzd)
        date    mid
1 2011-08-31 0.8378
2 2011-07-31 0.8457
3 2011-06-30 0.8147

También podrías usar el parse_date_time función de la lubridate paquete:

library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"

parse_date_time devuelve un objeto POSIXct, por lo que usamos as.Date para obtener un objeto de fecha. El primer argumento de parse_date_time especifica un vector de fecha, el segundo argumento especifica el orden en que ocurre su formato. Él orders el argumento hace parse_date_time muy flexible.

valoraciones y comentarios

Si para ti ha sido de utilidad este artículo, sería de mucha ayuda si lo compartes con otros entusiastas de la programación y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *