Trabajar con fechas en el lenguaje R (características básicas, así como paquetes lubridate y timeperiodsR)

Obtenga la fecha actual en cualquier lenguaje de programación, una operación equivalente a "¡Hola mundo!" El lenguaje R no es una excepción.


En este artículo, entenderemos cómo se organiza el trabajo con fechas en la sintaxis básica del lenguaje R, y también consideraremos varios paquetes útiles que amplían sus capacidades cuando se trabaja con fechas:


  • lubridate - un paquete que permite cálculos aritméticos entre fechas;
  • timeperiodsR : un paquete para trabajar con intervalos de tiempo y sus componentes.




Contenido


  1. Trabajar con fechas en la sintaxis R básica
    1.1. Convertir texto a fecha
    1.2. Recuperando componentes de fecha en Base R
  2. Trabajando con fechas con el paquete lubridate
    2.1. Convertir texto a fecha usando lubridate
    2.2. Recuperando componentes de fecha usando el paquete lubridate
    2.3. Operaciones aritméticas con fechas.
  3. Trabajo simplificado con períodos, paquete timeperiodsR
    3.1. Intervalos de tiempo en períodos de tiempo R
    3.2. Filtrar un vector de fecha con períodos de tiempo R
  4. Conclusión



Trabajar con fechas en la sintaxis R básica


Convertir texto a fecha


En R básico hay un conjunto de funciones para trabajar con fechas. La desventaja de la sintaxis básica es que el registro de nombres y argumentos de funciones está muy fragmentado y prácticamente no tiene conexión lógica. Sin embargo, las funciones básicas del lenguaje deben ser conocidas, por lo que comenzaremos con ellas.


Con mayor frecuencia, al cargar datos en R, desde archivos csv u otras fuentes, obtiene la fecha en forma de texto. Para as.Date() este texto al tipo de datos correcto, use la función as.Date() .


 #      my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23") #    class(my_dates) 

 #> [1] "character" 

 #     my_dates <- as.Date(my_dates) #    class(my_dates) 

 #> [1] "Date" 

Por defecto, as.Date() acepta una fecha en dos formatos: AAAA-MM-DD o AAAA / MM / DD .
Si las fechas en su conjunto de datos están en cualquier otro formato, puede usar el argumento de format para la conversión.


 as.Date("September 26, 2019", format = "%B %d, %Y") 

formato acepta en forma de cadena operadores que denotan cualquier intervalo de tiempo y su formato, los valores utilizados con mayor frecuencia se muestran en la tabla a continuación:


FormatoDescripción
% dNúmero de día en mes
% aAbreviatura para el nombre del día de la semana.
% ANombre completo del día de la semana.
% wNúmero del día de la semana (0-6, donde 0 es domingo)
% mDesignación de mes de dos dígitos (01-12)
% bAbreviatura para el nombre del mes (abril, marzo, ...)
% BNombre completo del mes
% yDesignación de año de dos dígitos
% YDesignación de año de cuatro dígitos
% jNúmero de día del año (001 - 366)
% UNúmero de semana del año (00 - 53), inicio de semana domingo
% WNúmero de semana del año (00 - 53), inicio de semana lunes

En consecuencia, "26 de septiembre de 2019" es el nombre completo del mes, día y año. Puede describir este formato de fecha con los operadores de la siguiente manera: "%B %d, %Y" .


Donde:


  • %B - Nombre completo del mes
  • %d - Número de día en el mes
  • %Y - Designación de año de cuatro dígitos

Al describir el formato de fecha, es importante incluir todos los caracteres adicionales de su cadena, como guiones, comas, puntos, espacios, etc. En mi ejemplo, "26 de septiembre de 2019", se coloca una coma después de la fecha, y también se debe poner una coma en la descripción del formato: "%B %d, %Y" .


Hay situaciones en las que obtiene una fecha que no solo es inapropiada para los formatos estándar (AAAA-MM-DD o AAAA / MM / DD) , sino también en un idioma que difiere de la configuración predeterminada en su sistema operativo. Por ejemplo, descargó datos donde la fecha se indica en el siguiente formulario: "15 de diciembre de 2019". Antes de convertir esta cadena en una fecha, debe cambiar la configuración regional.


 #   Sys.setlocale("LC_TIME", "Russian") #     as.Date(" 15, 2019 .", format = "%B %d, %Y") 

Recuperando componentes de fecha en Base R


No hay muchas funciones en R básico que le permitan extraer cualquier parte de una fecha de un objeto de la clase Fecha .


 current_date <- Sys.Date() #   weekdays(current_date) #     months(current_date) #      quarters(current_date) #      

Además de la clase principal de objetos Date en la base R, hay 2 tipos de datos más que almacenan la marca de tiempo: POSIXlt , POSIXct . La principal diferencia entre estas clases y Fecha es que almacenan tiempo además de la fecha.


 #      current_time <- Sys.time() #    current_time class(current_time) 

 # "POSIXct" "POSIXt" 

La función Sys.time() devuelve la fecha y hora actuales en formato POSIXct . Este formato es similar en significado a UNIXTIME y almacena el número de segundos desde el comienzo de la era UNIX (medianoche (UTC) desde el 31 de diciembre de 1969 hasta el 1 de enero de 1970) .


La clase POSIXlt también almacena la hora y la fecha, y todos sus componentes. Por lo tanto, es un objeto con una estructura más compleja, pero a partir de la cual es fácil obtener cualquier componente de la fecha y hora desde esencialmente POSIXlt es una lista .


 #      current_time_ct <- Sys.time() #    POSIXlt current_time_lt <- as.POSIXlt(current_time_ct) #      current_time_lt$sec #  current_time_lt$min #  current_time_lt$hour #  current_time_lt$mday #   current_time_lt$mon #  current_time_lt$year #  current_time_lt$wday #   current_time_lt$yday #   current_time_lt$zone #   

La conversión de datos numéricos y de texto a formatos POSIX * se realiza mediante las funciones as.POSIXct() y as.POSIXlt() . Estas funciones tienen un pequeño conjunto de argumentos.


  • x: el número, cadena u objeto de la clase de fecha que se convertirá;
  • tz: zona horaria, el valor predeterminado es "GMT";
  • formato: descripción del formato de fecha en que se presentan los datos pasados ​​en el argumento x;
  • origen: se usa solo al convertir un número a POSIX, debe pasar un objeto de fecha a este argumento y el tiempo a partir del cual se cuentan los segundos. Normalmente se usa para la traducción de UNIXTIME.

Si sus datos de fecha y hora se presentan en UNIXTIME , utilice el siguiente ejemplo para convertirlos en una fecha comprensible y legible:


 #  UNIXTIME    as.POSIXlt(1570084639, origin = "1970-01-01") 

En origen, puede especificar cualquier marca de tiempo. Por ejemplo, si en sus datos la fecha y la hora se indican como la cantidad de segundos que comienzan el 15 de septiembre de 2019 a las 12:15, para convertirlas en una fecha, use:


 #  UNIXTIME       15  2019 12:15 as.POSIXlt(1546123, origin = "2019-09-15 12:15:00") 

Trabajando con fechas con el paquete lubridate


lubridate quizás el paquete más popular para trabajar con fechas en R. Le proporciona tres clases más adicionales.


  • duraciones - duración, es decir número de segundos entre dos marcas de tiempo;
  • períodos: los períodos le permiten realizar cálculos entre fechas de intervalos legibles por humanos: días, meses, semanas, etc.
  • intervalos: objetos que proporcionan el punto inicial y final en el tiempo.

La instalación de paquetes adicionales en el lenguaje R se realiza mediante la función estándar install.packages() .


Instalación del paquete lubridate :


 install.packages("lubridate") 

Convertir texto a fecha usando lubridate


Las funciones del paquete lubridate simplifican enormemente el proceso de conversión de texto a fecha, y también le permiten realizar cualquier operación aritmética con fechas y horas.


Las funciones today() y now() lo ayudarán a obtener la fecha actual, o la fecha y la hora.


 today() #   now() #     

Para convertir una cadena en una fecha, lubridate tiene una familia completa de funciones cuyos nombres siempre consisten en tres letras e indican una secuencia de componentes de fecha:


  • y - año
  • m - mes
  • d - día

Lista de funciones para convertir texto a la fecha a través de lubridate
  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Algunos ejemplos para convertir cadenas a fechas:


 ymd("2017 jan 21") mdy("March 20th, 2019") dmy("1st april of 2018") 

Como puede ver, lubridate mucho más eficiente para reconocer descripciones de fechas en forma de texto, y le permite convertir texto a fecha sin usar operadores adicionales para describir el formato.


Recuperando componentes de fecha usando el paquete lubridate


También usando lubridate puede obtener cualquier componente de una fecha:


 dt <- ymd("2017 jan 21") year(dt) #  month(dt) #  mday(dt) #    yday(dt) #    wday(dt) #   

Operaciones aritméticas con fechas.


Pero, la funcionalidad más importante y básica de lubridate es la capacidad de realizar varias operaciones aritméticas con fechas.


El redondeo de una fecha se realiza mediante tres funciones:


  • floor_date - redondeando a la hora pasada más cercana
  • ceiling_date - redondeando al futuro cercano
  • round_date - redondeando a la hora más cercana

Cada una de estas funciones tiene un argumento de unidad , que le permite especificar una unidad de redondeo: segundo, minuto, hora, día, semana, mes, bimestre, trimestre, temporada, medio año, año


 dt <- ymd("2017 jan 21") round_date(dt, unit = "month") #    round_date(dt, unit = "3 month") #   3  round_date(dt, unit = "quarter") #    round_date(dt, unit = "season") #    round_date(dt, unit = "halfyear") #    

Entonces, descubramos cómo obtener una fecha que será 8 días después de la fecha actual y realicemos otros cálculos aritméticos entre dos fechas.


 today() + days(8) #     8  today() - months(2) #    2   today() + weeks(12) #     12  today() - years(2) #    2   

Trabajo simplificado con períodos, paquete timeperiodsR.


timeperiodsR es un paquete nuevo para trabajar con fechas que se publicó en CRAN en septiembre de 2019.


Instalación del paquete timeperiodsR :


 install.packages("timeperiodsR") 

El objetivo principal es determinar rápidamente un cierto intervalo de tiempo en relación con una fecha determinada. Por ejemplo, usando sus funciones, puede fácilmente:


  • Obtenga la última semana, mes, trimestre o año en R.
  • Obtenga el número especificado de intervalos de tiempo relativos a la fecha, por ejemplo, las últimas 4 semanas.
  • Es fácil extraer sus componentes del intervalo de tiempo obtenido: las fechas de inicio y finalización, el número de días que caen dentro del intervalo, la secuencia completa de fechas que lo ingresan.

El nombre de todas las funciones del paquete timeperiodsR intuitivo y consta de dos partes: dirección _ intervalo , donde:


  • dirección en la que es necesario moverse en relación con una fecha determinada: last_n, previous, this, next, next_n.
  • intervalo de tiempo para calcular el período: día, semana, mes, trimestre, año.

Conjunto completo de funciones:
  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

Intervalos de tiempo en períodos de tiempo R


Estas funciones son útiles cuando necesita crear informes basados ​​en datos de la última semana o mes. Para obtener el último mes, use la función del mismo nombre previous_month() :


 prmonth <- previous_month() 

Después de lo cual tendrá un objeto prprth de la clase tpr , desde el cual puede obtener fácilmente los siguientes componentes:


  • fecha de inicio del período, en nuestro ejemplo este es el último mes
  • fecha de finalización del período
  • el número de días incluidos en el período
  • secuencia de fechas incluidas en el período

Además, puede obtener cada uno de los componentes de diferentes maneras:


 #    prmonth$start start(prmonth) #    prmonth$end end(prmonth) #   prmonth$sequence seq(prmonth) #      prmonth$length length(prmonth) 

También puede obtener cualquiera de los componentes utilizando el argumento de parte , que está presente en cada una de las funciones del paquete. Valores posibles: inicio, final, secuencia, longitud.


 previous_month(part = "start") #   previous_month(part = "end") #   previous_month(part = "sequence") #   previous_month(part = "length") #     

Entonces, veamos todos los argumentos disponibles en las funciones del paquete timeperiodsR :


  • x : la fecha de referencia a partir de la cual se calculará el período de tiempo; de forma predeterminada, la fecha actual;
  • n - El número de intervalos que se incluirán en el período, por ejemplo, 3 semanas anteriores;
  • part : qué componente del objeto tpr necesita obtener, por defecto all ;
  • week_start : el argumento está presente solo en las funciones para trabajar con semanas, y le permite especificar el número del día de la semana que se considerará su comienzo, de manera predeterminada, el comienzo de la semana es lunes, pero puede especificar cualquiera de 1 - lunes a 7 - domingo.

Por lo tanto, puede calcular cualquier período de tiempo relativo a la fecha actual o cualquier otra fecha dada, daré algunos ejemplos más:




 #  3   #  6  2019  #   -  last_n_weeks(x = "2019-10-06", n = 3, week_start = 1) 

  Time period: from 9 September of 2019, Monday to 29 September of 2019, Sunday 

6 de octubre es domingo:
6 de octubre de 2019


Necesitamos un período que, en relación con el 6 de octubre, tome 3 semanas anteriores. No incluye la semana del 6 de octubre. En consecuencia, este es el período del 9 al 29 de septiembre.


3 semanas a partir del 6 de octubre de 2019




 #     4  #  16  2019  previous_month(x = "2019-09-16", n = 4) 

  Time period: from 1 May of 2019, Wednesday to 31 May of 2019, Friday 

En este ejemplo, estamos interesados ​​en el mes que fue hace 4 meses, si procedemos del 16 de septiembre de 2019, en consecuencia, fue mayo de 2019.


Filtrar un vector de fecha con períodos de tiempo R


Existen varios operadores para filtrar fechas en timeperiodsR de tiempo timeperiodsR :


  • % left_out%: compara dos objetos de la clase tpr y devuelve el valor de la izquierda, que no está en la derecha.
  • % left_in%: compara dos objetos de la clase tpr y devuelve fechas del objeto izquierdo que se incluyen en el derecho.
  • % right_out%: compara dos objetos de la clase tpr y devuelve el valor de la derecha, que está ausente en la izquierda.
  • % right_in%: compara dos objetos de la clase tpr y devuelve las fechas del objeto derecho que están presentes en el izquierdo.

 period1 <- this_month("2019-11-07") period2 <- previous_week("2019-11-07") period1 %left_in% period2 #    period1    period2 period1 %left_out% period2 #    period1     period2 period1 %right_in% period2 #    period2    period1 period1 %right_out% period2 #    period2     period1 

Conclusión


Examinamos en detalle las clases de objetos que están diseñados en el lenguaje R para trabajar con fechas. Además, ahora puede realizar operaciones aritméticas en fechas y obtener rápidamente cualquier período de tiempo utilizando el paquete timeperiodsR .


Si está interesado en el lenguaje R, lo invito a suscribirse a mi canal de telegramas R4marketing , en el que a diario comparto materiales útiles sobre el uso del lenguaje R para resolver mis tareas cotidianas.

Source: https://habr.com/ru/post/469215/


All Articles