Cuando vamos a realizar algún tipo de código en R para el que necesitemos utilizar fechas, debemos tener presente el formato en el que R almacena las fechas, ya que nos será de utilidad a la hora de trabajar con ellas.
El estándar utilizado por R para las fechas es yyyy-mm-dd, es decir, año-mes-día. Para introducir una fecha en R, debemos utilizar siempre el comando ‘as.Date‘. Si no lo utilizamos, el programa leerá nuestra fecha como una variable ‘character‘, y lógicamente no podremos utilizarla como fecha.
Vamos a verlo con un ejemplo:
navidad2019 <- ("2019-12-25")
navidad2019
[1] "2019-12-25"
class(navidad2019)
[1] "character"
Sin embargo, si utilizamos el comando as.Date en el momento de almacenar la fecha:
navidad2019=as.Date("2019-12-25")
navidad2019
[1] "2019-12-25"
class(navidad2019)
[1] "Date"
Ahora sí hemos conseguido definir como fecha el 25 de diciembre de 2019 en R.
Otro comando predefinido que nos puede ser muy útil cuando estemos escribiendo algún código que utilice fechas, es la «captura» de la fecha almacenada en el sistema (en tu PC).
Sys.Date()
[1] "2020-02-26" # Hoy es 26 de febrero de 2020
Jugando con distintos formatos de fecha en R
Como os he comentado antes, R siempre almacena las fechas en el mismo formato, sin embargo, es capaz de leer muchos más formatos de fechas:
# Símbolo # Significado %d día (numérico, de 0 a 31) %a día de la semana abreviado a tres letras %A día de la semana (nombre completo) %m mes (numérico de 0 a 12) %b mes (nombre abreviado a tres letras) %B mes (nombre completo) %y año (con dos dígitos) %Y año (con cuatro dígitos)
Cuando queramos introducir en R una fecha con un formato distinto al predeterminado, volveremos a usar el comando as.Date pero acompañado del formato deseado (haciendo uso de la tabla anterior).
navidad2020=as.Date("25/12/2020",format="%d/%m/%Y")
navidad2020
[1] "2020-12-25"
navidad2021=as.Date("25 Diciembre 2021",format="%d %B %Y")
navidad2021
[1] "2021-12-25"
Como podemos ver, hemos introducido fechas con formatos distintos, y R ha sido capaz de leerlas y guardarlas correctamente.
Sin embargo, si el formato y la fecha introducida no coinciden, R no será capaz de guardar la variable, y nos devolverá una variable vacía:
navidad2021=as.Date("25-dic-2021",format="%d-%m-%Y")
navidad2021
[1] NA
Del mismo modo que estamos introduciendo fechas en otro formato, pero R nos las sigue mostrando en su formato predeterminado, también podemos hacer que nos las muestre en pantalla con el formato que nosotros queramos. Para ello, podremos utilizar cualquiera de las combinaciones indicadas en el cuadro de arriba:
navidad2019
[1] "2019-12-25"
navidad2019 <- format(navidad2019,"%d %B %Y")
navidad2019
[1] "25 diciembre 2019"
# ¡PERO ATENCIÓN! Ya no es tipo fecha:
class(navidad2019)
[1] "character"
También tenemos la opción de trabajar con vectores de fechas, de este modo podremos tratar rápidamente la información de un conjunto de fechas:
dias=c("1/10/2005","2/2/2006","3/4/2006","8/11/2014")
dias
[1] "1/10/2005" "2/2/2006" "3/4/2006" "8/11/2014"
class(dias) # Vemos que este vector todavía no es una fecha:
[1] "character"
Recuerda que para definir una fecha en R, debemos utilizar la fórmula as.Date, y definir el formato de fecha que estamos utilizando:
dias2 = as.Date(dias,format="%d/%m/%Y")
dias2
[1] "2005-10-01" "2006-02-02" "2006-04-03" "2014-11-08"
class(dias2)
[1] "Date"
Operaciones con fechas en R
Siempre que almacenemos un valor como fecha en R, accederemos a una serie de fórmulas predefinidas para realizar operaciones con fechas.
# Podemos contar el número de días entre dos fechas:
ene01 = as.Date("2019-01-01")
ene30 = as.Date("2019-01-30")
ene30-ene01
[1] Time difference of 29 days
Solamente podremos realizar estos cálculos cuando las fechas estén almacenadas correctamente en R, en caso contrario, nos devolverá un error:
navidad2021
[1] "2021-12-25"
navidad2019
[1] "25 diciembre 2019"
# navidad2019 ya no es tipo fecha
navidad2021-navidad2019
Error in unclass(as.Date(e1)) - e2 :
non-numeric argument to binary operator
La función difftime en R (en el enlace os cuento más sobre esta función) nos permite obtener diferencias entre fechas en semanas, horas, minutos o segundos.
# Diferencia en semanas (weeks)
difftime(ene30, ene01, units = "weeks")
[1] Time difference of 4.142857 weeks
# Diferencia en horas (hours)
difftime(ene30, ene01, units = "hours")
[1] Time difference of 696 hours
# Diferencia en minutos (mins)
difftime(ene30, ene01, units = "mins")
[1] Time difference of 41760 mins
# Diferencia en segundos (secs)
difftime(ene30, ene01, units = "secs")
[1] Time difference of 2505600 secs
En R también podemos sumar o restar fechas:
# Sumar días a una fecha
navidad2020 + 6
[1] "2020-12-31"
# Restar días a una fecha
navidad2020 - 24
[1] "2020-12-01"
Si necesitas ayuda con las fechas en R, también te puede interesar este otro tutorial de R:
Roger Paguaga dice
Cómo puedo leer la fecha de creacion o modificación de un archivo en especifico???
Saludos.
Javier dice
¡Buenas! ¿Desde R te refieres?
Anónimo dice
Hola quiero hacerlo pero solo con el año pero cuando le doy el formato pide que tenga dia y mes ¿como hago para hacerlo con solo una dato ?
Javier dice
Buenas. Necesito que seas un poco más concreto, no entiendo cuál es la duda. ¿Qué es lo que quieres hacer con el año?
Un saludo.
Jorge Villablanca Mouesca dice
Hola, tengo un dataset, donde el campo f_matriculación esta definido como character.
Necesito transformar esa columna a formato «date» o fecha y luego obtener para esa columna solo el año
Cual sería el script?
Si me pudieras copiar a mi mail, jorgevillablanca@hotmail.com
Saludos
Javier dice
¡Te contesto por correo!
Y añado aquí la respuesta:
Otra opción sería, por ejemplo, convertirla a tipo fecha, y sobre esta fecha quedarnos el año (en este caso lo hacemos en formato numérico):
Alejandra Rivera dice
Hooola! podrias poner ese comando que le respondiste por correo, requiero exactamente lo mismo. :)
Javier dice
Hola!! Añado la respuesta arriba :)
Alejandra Rivera dice
Hola! Javier otra pregunta, tengo un dataset el cual tiene la fecha corta, es decir (06-12-19), como no sé los otros dos dígitos, pero asumo yo que son de 1919, no de 2019, como hago para indicarselo al software, teniendo en cuenta que habrán otras observaciones que si son del 2000 en adelante como 01 que es 2001.
Javier dice
Hola Alejandra!!
Es cierto que R tiene este problema desde la fecha 1970, es decir, no es capaz de leer directamente el «69» como 1969, y el mismo problema del 1969 ocurre para todos los años anteriores a esta fecha (es un tema interno del código R, que trata como «año 0» el 1 de enero de 1970).
Te propongo una solución a tu problema:
fecha = c(«6/12/19″,»10/05/39″)
as.Date(format(as.Date(fecha,format=»%d/%m/%y»), «19%y%m%d»), «%Y%m%d»)
[1] «1919-12-06» «1939-05-10»
Jesús dice
Hola!
Tengo un dataset al que quiero agregarle fechas. Mi dataset está formado por un dato por día, es decir 365, desde 1 de enero a 31 de diciembre, y no se cómo agregarle la fecha automáticamente sin tener que hacerlo manual. ¿alguna idea?
Gracias!!
Javier dice
Hola Jesús!!
Es muy sencillo utilizando la función «seq». Para el año 2020 sería así:
seq(as.Date(‘2020-01-01′), by=’day’, length=366)
Te en cuenta que son 366 porque 2020 es año bisiesto, en caso contrario sería 365.
Saludos!
Anónimo dice
Gracias!!
Santiago dice
Hola Javier, tengo un dataset de 18 columnas, y 2 de ellas son month y year, y necesito crear una nueva columna en modo fecha usando el mes y el año, y no se me ocurre como hacerlo.
Muchas gracias
Javier dice
Hola Santiago!!
Échale un vistazo a la librería «zoo», creo que podría ayudarte bastante la función llamada as.yearmon.
Te pongo un ejemplo:
#Concatenamos las variables donde tengamos el mes y el año
nueva_fecha = paste(10,1993, sep=«»)
#Utilizamos la función yearmon para convertir esa concatenación en una fecha
fecha <- as.yearmon(as.character(nueva_fecha), "%m%Y") fecha [1] "oct. 1993"
DANIELA SEVILLA MOREIRA dice
ene01 = as.Date(«2019-01-01»)
ene30 = as.Date(«2019-01-30″)
ene30-ene01
[1] Time difference of 29 days
Una pregunta en este caso, hay alguna manera para que en lugar que me tire » [1] Time difference of 29 days» simplemente me tire la cantidad 29 ?
Es para luego usar ese número en una fórmula
Javier dice
Hola Daniela!!
Simplemente añade la función as.numeric delante de la resta para obtener el número.
ene01 = as.Date(«2019-01-01»)
ene30 = as.Date(«2019-01-30″)
as.numeric(ene30-ene01)
[1] 29
Daniel dice
Hola Javier, tengo un data set que tiene el formato de 1/3/2020, pero en R necesito hacerla de la forma 01/03/2020 para poderla hacer date. Cómo puedo hacer esto con dplyr. Gracias
Javier dice
Hola Daniel, no entiendo cual es la dificultad.
Fíjate en la tabla que puse arriba sobre los formatos.
x <- "1/3/2020" fecha <- as.Date(x,'%d/%m/%Y') fecha [1] "2020-03-01"
Anónimo dice
Hola Javier, si quiero pasar esa diferencia en días, a meses, qué código puedo utilizar? Gracias
Javier dice
Hola, mírate la función difftime https://estadisticamente.com/extraer-fecha-r-ano-mes-dia/
Evangelina dice
Hola Javier, como puedo hacer si quiero armar una fecha que tenga solo el mes y el año? estoy trabajando con promedio mensuales y quiero ver como aumenta o disminuye año a año. Desde ya muchas gracias!! saludos
Javier dice
Hola Evangelina!!
Simplemente tienes que poner el formato sin día:
as.Date(fecha,’%m/%Y’)
Saludos!
Adriana dice
Hola, quisiera separar los las fechas de las horas de este código
fecha_hora<- seq(as.POSIXct('2019-01-01'), by='1 hour', length=8760)
Si pudieras ayudarme, te lo agradecería.
Javier dice
Hola Adriana!
No entiendo el problema, he probado ese código y hace lo que quieres, ¿no? Separa hora a hora y lo almacena en la variable fecha_hora
Saludos!
Katheryn Sarahi dice
Hola, tengo una base de datos en R con 1800 datos, y asi el numero de fechas de nacimiento de diferentes personas, necesito restar de cada fecha de la base de datos una fecha en especifica del pasado tambien. Como debo hacerlo? extraje la variable con $ y luego solo la resto con la fecha correspondiente pero recibo: que solo se puede sustraer de la Data. Muchas gracias
Javier dice
¿Estás usando el as.date cuando creas ese campo?
Julia Farías dice
Hola, yo tengo el campo «Fecha.de.Nacimiento» con 91 obs. De mi data frame «mujeres». Intento pasarla a date, y no lo logro cuando consulto el class me dice factor. Preciso crear un nuevo campo «Edad» para calcular la edad a hoy.
Franklin Chiluisa dice
Estimado quiero que en mi grafica en el eje x aparezca la etiqueta como fecha , el dato es diario.
Mis dos varaibles son fecha y hc(numero de taenciones)
Coloque asi porque solo necesito la infromacion del 2020
mytimeseries= ts(data=mydata$HC,start = as.Date(«13/03/2020»), frequency = 365)
plot(mytimeseries)
Al hacer la grafica en el eje x me sale la etiqueta como -714701.0
Franklin chiluisa dice
Hola tengo mis datos diarios con dos variables fecha y atenciones necesito hacer dos operaciones.
1. Filtrar el inicio desde el 13/30/2020 hasta el dato actual
2.graficar la data pero en el eje x se etiquete la fecha
Javier dice
Hola!
1. Para la fecha actual simplemente utiliza el comando Sys.Date() como explico en este post
2. Simplemente necesitas un vector con la secuencia entre tu fecha inicial y tu fecha Sys.Date(). He subido precisamente hoy una nueva entrada que te puede ayudar con eso https://estadisticamente.com/crear-una-secuencia-de-fechas-en-r/
Paloma dice
Buenas,
Tengo dos columnas, una de ellas con fechas de nacimiento de un animal y otras con fechas en el que se adopto un animal, me gustaria hacer la diferencia para saber la edad en la que estas mascotas fueron adoptadas. Como podria hacerlo? Seria hacer una diferencia de ambas columnas para que me diera un numero
Gracias
Javier dice
Buenas!!
¿No te funciona el apartado «Operaciones con fechas en R»?
Gabriela Cardenas dice
Hola Javoer,
He importado unos datos de excel y las fechas me dice que quedaron con un formato POSIXct. Como las puedo poner en formato fecha de R?
Gracias. Tu blog es excelente¡
Javier dice
No te funciona el as.Date ?
Eilyn dice
4. La función tipo_dia toma de parámetro una fecha, si el día es de lunes a viernes,
indica entre semana y si es sábado o domingo, indica fin de semana (Còmo lo resuelvo).
Javier dice
Puedes resolverlo con un if/else
Rafael dice
Buenos días Javier,
En una base de datos se recogen determinados parámetros definidos en el espacio, por ejemplo, una retención en una carretera de longitud 5 kilómetros, entre el punto kilométrico 0 y el punto kilométrico 5, y en el tiempo, desde las 7:35:10 h a las 9:42:20 h.
Quisiera asignar a cada intervalo de 15 minutos (de 7:15:00 a 7:30:00 h, de 7:30:00 a 7:45:00 h, …) el valor correspondiente, en este caso, los 5 kilómetros.
Seguramente me estoy liando con multitud de ifelse, puedes sugerirme alguna opción más eficiente?
Gracias y saludos
Alejandra Cortés dice
Hola Javier, cómo estas?
quería preguntarte como puedo hacer para que todos mis años tengan por definición 365 días
df %
mutate(Indicador = 1:nrow(df))
df %
mutate(Fecha = dmy(«31-12-1978»)+Indicador) %>%
select(!Indicador)
Ya que al definirlo de esta manera, me quedan algunos años en 366 días.
muchas gracias!
Javier dice
Te quedan en 366 días los años bisiestos, ¿no? Es lo correcto…
Gabriela Cardona dice
Hola, necesito hacer una resta de fechas pero en una base de datos extenuante, es decir, necesito restar dos columnas de fechas. ¿Me podrías ayudar?
Gracias
Javier dice
¿Y qué problema te estás encontrando? En principio debería ser suficiente con restar una columna a la otra y ya está!!
Maria dice
Hola,
Tengo la columna de fecha en formato año-mes-día, con datos de cuatro años, y quiero hacer otra columna en la que la fecha sea una variable número donde la primera fecha es 1, y luego 2, 3, 4….etc.
Gracias
Jenny dice
Hola!
Quisiera saber si en R hay alguna función que me pueda decir si un listado de fechas es consecutiva en cuanto al mes.
Ejemplo:
2016-04-01
2016-06-01
2016-07-01
2016-08-01
En este caso no sería consecutivo, ya que se salta desde el mes de abril de 2016 hasta el mes de junio de 2016
Javier dice
Puedes utilizar una columna adicional para hacer lags, en esa columna sacas la resta con la fecha anterior y si el lag es mayor de 1 pues significa que no son consecutivos.
Oswaldo dice
Hola Javier.
Qué puedo hacer para recuperar solamente el mes de una fecha y agregarlo en una columna nueva?
Espero me puedas ayudar y gracias de antemano.