• Ir a navegación principal
  • Ir al contenido principal
  • Ir a la barra lateral primaria

Estadísticamente

  • Blog
  • Contacto
  • Lista de correo

15 marzo, 2019 by Javier 46 comentarios

Trabajando con Fechas en R

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.

¿Quieres aprender a programar R o Python?

Te aviso cada vez que publique

Please wait...

Gracias por suscribirte.

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:

  • Extraer el día, el mes o el año de una fecha en R.
También te puede interesar  Operaciones con Fechas en R

Archivado en:Programar en R

Interacciones con los lectores

Comentarios

  1. Roger Paguaga dice

    10 noviembre, 2019 en 14:35

    Cómo puedo leer la fecha de creacion o modificación de un archivo en especifico???

    Saludos.

    Responder
    • Javier dice

      13 noviembre, 2019 en 01:04

      ¡Buenas! ¿Desde R te refieres?

      Responder
  2. Anónimo dice

    24 noviembre, 2019 en 23:20

    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 ?

    Responder
    • Javier dice

      13 diciembre, 2019 en 01:37

      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.

      Responder
  3. Jorge Villablanca Mouesca dice

    10 enero, 2020 en 14:33

    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

    Responder
    • Javier dice

      15 enero, 2020 en 00:18

      ¡Te contesto por correo!

      Y añado aquí la respuesta:

      a <- c("01/01/2009", "01/01/2010" , "01/01/2011")

      substring(a,7,10)

      [1] «2009» «2010» «2011»

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

      date <- as.Date('01/01/2011','%m/%d/%Y')

      date

      [1] «2011-01-01»

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

      year

      [1] 2011

      Responder
      • Alejandra Rivera dice

        23 enero, 2020 en 06:31

        Hooola! podrias poner ese comando que le respondiste por correo, requiero exactamente lo mismo. :)

        Responder
        • Javier dice

          23 enero, 2020 en 16:56

          Hola!! Añado la respuesta arriba :)

          Responder
  4. Alejandra Rivera dice

    23 enero, 2020 en 06:34

    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.

    Responder
    • Javier dice

      23 enero, 2020 en 15:05

      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»

      Responder
  5. Jesús dice

    10 marzo, 2020 en 13:02

    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!!

    Responder
    • Javier dice

      10 marzo, 2020 en 22:01

      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!

      Responder
      • Anónimo dice

        11 marzo, 2020 en 10:07

        Gracias!!

        Responder
  6. Santiago dice

    8 mayo, 2020 en 18:08

    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

    Responder
    • Javier dice

      10 mayo, 2020 en 18:51

      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"

      Responder
  7. DANIELA SEVILLA MOREIRA dice

    10 mayo, 2020 en 05:43

    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

    Responder
    • Javier dice

      10 mayo, 2020 en 18:27

      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

      Responder
  8. Daniel dice

    14 mayo, 2020 en 05:12

    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

    Responder
    • Javier dice

      14 mayo, 2020 en 09:13

      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"

      Responder
  9. Anónimo dice

    27 mayo, 2020 en 12:39

    Hola Javier, si quiero pasar esa diferencia en días, a meses, qué código puedo utilizar? Gracias

    Responder
    • Javier dice

      27 mayo, 2020 en 14:47

      Hola, mírate la función difftime https://estadisticamente.com/extraer-fecha-r-ano-mes-dia/

      Responder
  10. Evangelina dice

    6 junio, 2020 en 02:36

    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

    Responder
    • Javier dice

      8 junio, 2020 en 10:53

      Hola Evangelina!!

      Simplemente tienes que poner el formato sin día:

      as.Date(fecha,’%m/%Y’)

      Saludos!

      Responder
  11. Adriana dice

    10 junio, 2020 en 17:37

    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.

    Responder
    • Javier dice

      15 junio, 2020 en 09:14

      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!

      Responder
  12. Katheryn Sarahi dice

    14 junio, 2020 en 23:48

    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

    Responder
    • Javier dice

      15 junio, 2020 en 08:52

      ¿Estás usando el as.date cuando creas ese campo?

      Responder
      • Julia Farías dice

        4 noviembre, 2020 en 04:40

        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.

        Responder
  13. Franklin Chiluisa dice

    17 junio, 2020 en 03:52

    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

    Responder
  14. Franklin chiluisa dice

    18 junio, 2020 en 04:03

    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

    Responder
    • Javier dice

      18 junio, 2020 en 14:57

      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/

      Responder
  15. Paloma dice

    27 junio, 2020 en 14:43

    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

    Responder
    • Javier dice

      27 junio, 2020 en 21:45

      Buenas!!

      ¿No te funciona el apartado «Operaciones con fechas en R»?

      Responder
  16. Gabriela Cardenas dice

    4 julio, 2020 en 15:30

    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¡

    Responder
    • Javier dice

      9 julio, 2020 en 10:04

      No te funciona el as.Date ?

      Responder
  17. Eilyn dice

    9 julio, 2020 en 05:29

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

    Responder
    • Javier dice

      9 julio, 2020 en 10:04

      Puedes resolverlo con un if/else

      Responder
  18. Rafael dice

    10 julio, 2020 en 07:47

    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

    Responder
  19. Alejandra Cortés dice

    6 agosto, 2020 en 05:14

    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!

    Responder
    • Javier dice

      9 septiembre, 2020 en 11:58

      Te quedan en 366 días los años bisiestos, ¿no? Es lo correcto…

      Responder
  20. Gabriela Cardona dice

    9 septiembre, 2020 en 01:49

    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

    Responder
    • Javier dice

      9 septiembre, 2020 en 12:02

      ¿Y qué problema te estás encontrando? En principio debería ser suficiente con restar una columna a la otra y ya está!!

      Responder
  21. Maria dice

    30 noviembre, 2020 en 17:15

    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

    Responder
  22. Jenny dice

    3 diciembre, 2020 en 23:10

    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

    Responder
    • Javier dice

      4 diciembre, 2020 en 12:33

      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.

      Responder
  23. Oswaldo dice

    12 diciembre, 2020 en 00:42

    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.

    Responder

Responder a Javier Cancelar la respuesta

Tu dirección de correo electrónico no será publicada.

sidebar

sidebar-alt

2021 © N Theme by AsiThemes · N Theme on Genesis Framework · WordPress · Iniciar sesión
Si sigues utilizando este sitio asumiremos que estás de acuerdo con el uso de cookies para mejorar la experiencia del usuario.Vale