Obtener la fecha actual en cualquier lenguaje de programación es una operación equivalente a "¡Hola mundo!". El lenguaje R no es una excepción.
En este artículo, analizaremos cómo funciona el manejo de fechas en la sintaxis básica del lenguaje R, así como también revisaremos varios paquetes útiles que amplían sus capacidades al trabajar con fechas:
lubridate— paquete que permite realizar cálculos aritméticos entre fechas;timeperiodsR— paquete para trabajar con intervalos de tiempo y sus componentes.

Contenido
Si estás interesado en el análisis de datos, y en particular en el lenguaje R, quizás te interesen mis y canales. Gran parte del contenido está dedicado al lenguaje R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Trabajos con fechas en la sintaxis básica de R
Conversión de 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 los nombres y argumentos de las funciones es muy desarticulado y prácticamente no tiene conexión lógica. Sin embargo, es necesario conocer las funciones básicas del lenguaje, así que comenzaremos precisamente con ellas.
Lo más común al cargar datos en R, desde archivos csv o de otras fuentes, es que recibas la fecha en formato de texto. Para convertir este texto al tipo de dato correcto, utiliza 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"funciona hasta que se finalice manualmente. Por lo tanto, puede ser útil la opción as.Date() que acepta fechas en dos formatos: AAAA-MM-DD o AAAA/MM/DD.
Si en tu conjunto de datos las fechas están presentadas en algún otro formato, puedes utilizar el argumento format.
as.Date("26 de septiembre de 2019", format = "%B %d, %Y")format que acepta como cadena de texto operadores que representan un intervalo temporal y su formato, los valores más usados se muestran en la tabla a continuación:
Formato
Descripción
%d
Número del día en el mes
%a
Abreviatura del nombre del día de la semana
%A
Nombre completo del día de la semana
%w
Número del día de la semana (0-6, donde 0 es domingo)
%m
Código de dos dígitos del mes (01-12)
%b
Abreviatura del nombre del mes (abr, mar, …)
%B
Nombre completo del mes
%y
Código de dos dígitos del año
%Y
Código de cuatro dígitos del año
%j
Número del día en el año (001 — 366)
%U
Número de la semana en el año (00 — 53), siendo el comienzo de la semana domingo
%W
Número de semana del año (00 — 53), inicio de la semana Lunes
Así, "September 26, 2019" es el nombre completo del mes, el número y el año. Este formato de fecha se puede describir con los siguientes operadores:"%B %d, %Y".
Donde:
%B— Nombre completo del mes%d— Número del día en el mes%Y— Representación de cuatro dígitos del año
Al describir el formato de la fecha, es importante incluir todos los símbolos adicionales de su cadena, como guiones, comas, puntos, espacios, etc. En mi ejemplo, "September 26, 2019", después de la fecha hay una coma, y en la descripción del formato también hay que incluir una coma:"%B %d, %Y".
Hay situaciones en las que recibe una fecha que no solo no corresponde a los formatos estándar (AAAA-MM-DD o AAAA/MM/DD), sino que también está en un idioma diferente al establecido por defecto en su sistema operativo. Por ejemplo, ha cargado datos donde la fecha se presenta de esta manera: "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")Extracción de componentes de la fecha en R básico
En R base no hay muchas funciones que permitan extraer cualquier parte de la fecha de un objeto de clase Date.
current_date <- Sys.Date() # fecha actual
weekdays(current_date) # obtener el número del día de la semana
months(current_date) # obtener el número del mes en el año
quarters(current_date) # obtener el número del trimestre en el añoAparte de la clase principal de objetos Date en R base hay otros 2 tipos de datos que almacenan marcas de tiempo: POSIXlt, POSIXct. La principal diferencia de estas clases es que además de la fecha, almacenan la hora. Date Sys.time()
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
La función devuelve la fecha y la hora actuales en formato . Este formato es conceptualmente similar a POSIXctUNIXTIME , y almacena la cantidad de segundos desde el comienzo de la era UNIX(medianoche (UTC) del 31 de diciembre de 1969 al 1 de enero de 1970) 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 del cual se pueden obtener fácilmente cualquier componente de fecha y hora, ya que en esencia.
Clase POSIXlt La conversión de datos numéricos y textuales a formatos POSIXlt este list.
# Получаем текущую дату и время
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 # часовой поясPOSIX* se realiza mediante funciones as.POSIXct() as.POSIXlt() y . Estas funciones tienen un conjunto limitado de argumentos.x — Número, cadena o objeto de clase
- , que debe convertirse; Datetz — Zona horaria, por defecto "GMT";
- format — Descripción del formato de fecha en el que se presentan los datos transmitidos en el argumento x;
- formato — Descripción del formato de fecha en el que se presentan los datos transmitidos en el argumento x;
- origin — Se utiliza solo al convertir un número a POSIX, en este argumento se debe pasar un objeto de fecha y hora a partir del cual se cuenta los segundos. Normalmente se usa para la conversión de UNIXTIME.
Si sus datos de fecha y hora están representados en , y almacena la cantidad de segundos desde el comienzo de la era UNIX, para convertirlos a una fecha comprensible y legible, utilice el siguiente ejemplo:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")En origin puede especificar cualquier marca de tiempo. Por ejemplo, si en sus datos la fecha y hora están indicadas como la cantidad de segundos a partir del 15 de septiembre de 2019 a las 12:15, para convertirlos a una fecha use:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Trabajando con fechas utilizando el paquete lubridate
lubridate quizás el paquete más popular para trabajar con fechas en el lenguaje R. Además, le proporciona tres clases adicionales.
- durations — duración, es decir, la cantidad de segundos entre dos marcas de tiempo;
- periods — los períodos permiten realizar cálculos entre fechas en intervalos comprensibles para el ser humano: días, meses, semanas, etc.;
- intervals — objetos que proporcionan el momento 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")Conversión de texto a fecha con lubridate
Las funciones del paquete lubridate simplifican significativamente el proceso de conversión de texto a fecha, así como le permiten realizar cualquier operación aritmética con fechas y tiempos.
Obtener la fecha actual, o la fecha y hora, le ayudarán las funciones today() y now().
today() # fecha actual
now() # fecha y hora actualesPara convertir una cadena en una fecha en lubridate hay toda una familia de funciones cuyos nombres constan siempre de tres letras, y representan la secuencia de componentes de la fecha:
- y — año
- m — mes
- d — día
Lista de funciones para convertir texto en fecha mediante lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Algunos ejemplos para convertir cadenas en fechas:
ymd("2017 ene 21")
mdy("20 de marzo de 2019")
dmy("1 de abril de 2018")Como puede ver, lubridate es significativamente más eficiente para reconocer descripciones de fechas en forma de texto y le permite convertir texto en fecha sin usar operadores adicionales para describir el formato.
Extracción de componentes de fechas con el paquete lubridate
También con ayuda de lubridate puede obtener cualquier componente de la fecha:
dt <- ymd("2017 ene 21")
year(dt) # año
month(dt) # mes
mday(dt) # día del mes
yday(dt) # día del año
wday(dt) # día de la semanaOperaciones aritméticas con fechas
Pero, la funcionalidad más importante y básica lubridate radica en la capacidad de realizar diversas operaciones aritméticas con fechas.
El redondeo de fechas se lleva a cabo mediante tres funciones:
floor_date— redondeo al tiempo pasado más cercanoceiling_date— redondeo al tiempo futuro más cercanoround_date— redondeo al tiempo más cercano
Cada una de estas funciones tiene un argumento de pruebas unitarias, que permite especificar la unidad de redondeo: segundo, minuto, hora, día, semana, mes, bimestre, trimestre, temporada, semestre, año
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # redondear al mes
round_date(dt, unit = "3 month") # redondear a 3 meses
round_date(dt, unit = "quarter") # redondear al trimestre
round_date(dt, unit = "season") # redondear a la temporada
round_date(dt, unit = "halfyear") # redondear al semestreAsí que, vamos a ver cómo obtener una fecha que será 8 días después de la fecha actual y realizar otros cálculos aritméticos entre dos fechas.
today() + days(8) # qué fecha será en 8 días
today() - months(2) # qué fecha era hace 2 meses
today() + weeks(12) # qué fecha será en 12 semanas
today() - years(2) # qué fecha era hace 2 añosTrabajo simplificado con períodos, el paquete timeperiodsR.
timeperiodsR — un nuevo paquete para trabajar con fechas que fue publicado en CRAN en septiembre de 2019.
Instalación del paquete timeperiodsR:
install.packages("timeperiodsR")Su objetivo principal es determinar rápidamente un intervalo de tiempo relativo a una fecha dada. Por ejemplo, con sus funciones puedes fácilmente:
- Obtener la semana, el mes, el trimestre o el año pasados en R.
- Obtener un número determinado de intervalos de tiempo relativos a una fecha, por ejemplo, las últimas 4 semanas.
- Extraer fácilmente de un intervalo de tiempo obtenido sus componentes: fecha de inicio y fecha de finalización, la cantidad de días que cayeron en el intervalo, toda la secuencia de fechas que incluye.
El nombre de todas las funciones del paquete timeperiodsR son intuitivamente comprensibles y consisten en dos partes: dirección_intervalo, donde:
- dirección en el que se debe mover relativamente a la fecha dada: last_n, previous, this, next, next_n.
- temporal intervalo 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 timeperiodsR
Estas funciones son útiles en situaciones donde necesitas generar informes basados en datos de la semana o el mes pasados. Para obtener el mes pasado, utiliza la función homónima previous_month():
prmonth <- previous_month()Después de lo cual tendrás un objeto prmonth de la clase tpr, del cual se pueden obtener fácilmente los siguientes componentes:
- la fecha de inicio del período, en nuestro ejemplo es el mes pasado
- la fecha de finalización del período
- la cantidad de días que abarca el período
- la secuencia de fechas que abarca el período
Además, se pueden 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 puedes obtener cualquiera de los componentes usando el argumento part, que está presente en cada una de las funciones del paquete. Valores posibles: start, end, sequence, length.
previous_month(part = "start") # inicio del período
previous_month(part = "end") # fin del período
previous_month(part = "sequence") # secuencia de fechas
previous_month(part = "length") # cantidad de días en el períodoAsí que, revisemos todos los argumentos disponibles en las funciones del paquete timeperiodsR:
x— Fecha de referencia desde la que se calculará el período, por defecto la fecha actual;n— Cantidad de intervalos que se incluirán en el período, por ejemplo, 3 semanas anteriores;part— Qué componente del objetotprnecesitas obtener, por defectotodo;week_start— Este argumento solo está presente en las funciones para trabajar con semanas, y permite establecer el número del día de la semana que se considerará como el inicio, por defecto el inicio de la semana es lunes, pero puedes establecer cualquiera desde 1 — lunes hasta 7 — domingo.
De este modo, puedes calcular cualquier período temporal en relación con la fecha actual, o cualquier otra fecha dada, aquí algunos ejemplos más:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) Período de tiempo: del 9 de septiembre de 2019, lunes al 29 de septiembre de 2019, domingo6 de octubre es domingo:

Necesitamos un período que, en relación con el 6 de octubre, tome 3 semanas anteriores. Sin incluir la semana que incluye el 6 de octubre. Por lo tanto, este es el período del 9 al 29 de septiembre.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Período de tiempo: del 1 de mayo de 2019, miércoles al 31 de mayo de 2019, viernesEn este ejemplo, nos interesa el mes que fue hace 4 meses, tomando como base el 16 de septiembre de 2019, por lo tanto fue mayo de 2019.
Filtrado de un vector de fechas utilizando timeperiodsR
Para filtrar fechas en timeperiodsR hay varios operadores:
- %left_out% — compara dos objetos de la clase tpr, y devuelve el valor del izquierdo, que no está presente en el derecho.
- %left_in% — compara dos objetos de la clase tpr, y devuelve las fechas del objeto izquierdo que están en el derecho.
- %right_out% — compara dos objetos de la clase tpr, y devuelve el valor del derecho, que no está presente en el izquierdo.
- %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 # obtener fechas de period1 que están en period2
period1 %left_out% period2 # obtener fechas de period1 que no están en period2
period1 %right_in% period2 # obtener fechas de period2 que están en period1
period1 %right_out% period2 # obtener fechas de period2 que no están en period1El paquete timeperiodsR tiene un canal oficial en ruso .
Conclusión
Hemos analizado en detalle las clases de objetos que están diseñadas en el lenguaje R para trabajar con fechas. También ahora puedes realizar operaciones aritméticas con fechas y obtener rápidamente cualquier período de tiempo usando el paquete timeperiodsR.
Si estás interesado en el lenguaje R, te invito a suscribirte a mi canal de Telegram , en el que comparto diariamente materiales útiles sobre la aplicación del lenguaje R en la resolución de mis tareas diarias.
Fuente: habr.com
