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()
ostrftime()
:
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.