Traballar con datas en R (capacidades básicas, así como os paquetes lubridate e timeperiodsR)

Obtén a data actual en calquera linguaxe de programación, unha operación equivalente a "Ola mundo!" A linguaxe R non é unha excepción.

Neste artigo, analizaremos como funciona traballar con datas na sintaxe básica da linguaxe R e tamén analizaremos varios paquetes útiles que amplían as súas capacidades ao traballar con datas:

  • lubridate — un paquete que che permite realizar cálculos aritméticos entre datas;
  • timeperiodsR — un paquete para traballar con intervalos de tempo e os seus compoñentes.

Traballar con datas en R (capacidades básicas, así como os paquetes lubridate e timeperiodsR)

Contido

Se estás interesado na análise de datos, e en particular na linguaxe R, podes estar interesado no meu telegrama и youtube canles. A maior parte do contido está dedicado á linguaxe R.

  1. Traballar con datas na sintaxe R básica
    1.1. Converter texto en data
    1.2. Extracción de compoñentes de data en R básico
  2. Traballar con dátiles usando o paquete de lubricado
    2.1. Converte texto a data usando lubridate
    2.2. Extracción de compoñentes de data usando o paquete de lubricado
    2.3. Operacións aritméticas con datas
  3. Traballo simplificado con períodos, paquete timeperiodsR
    3.1. Intervalos de tempo en períodos de tempoR
    3.2. Filtrando un vector de datas usando timeperiodsR
  4. Conclusión

Traballar con datas na sintaxe R básica

Converter texto en data

Basic R ten un conxunto de funcións para traballar con datas. A desvantaxe da sintaxe básica é que o caso dos nomes de funcións e dos argumentos está moi disperso e practicamente non ten conexión lóxica. Non obstante, cómpre coñecer as funcións básicas da lingua, polo que comezaremos por elas.

Na maioría das veces, cando se cargan datos en R, desde ficheiros csv ou doutras fontes, recibe unha data como texto. Para converter este texto ao tipo de datos correcto, use a 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 data en dous formatos: AAAA-MM-DD ou AAAA/MM/DD.
Se o teu conxunto de datos contén datas noutro formato, podes usar o argumento format.

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

formato acepta operadores en forma de cadea que denotan calquera intervalo de tempo e o seu formato; os valores máis utilizados móstranse na seguinte táboa:

Formato
Descrición

%d
Número de día en mes

%a
Abreviatura do nome do día da semana

%A
Nome completo do día da semana

%w
Número do día da semana (0-6, onde 0 é domingo)

%m
Designación do mes de dous díxitos (01-12)

%b
Abreviatura do nome do mes (abr, mar,...)

%B
Nome do mes completo

%y
Designación do ano de dous díxitos

%Y
Designación do ano de catro díxitos

%j
Número do día do ano (001 - 366)

%U
Número da semana do ano (00 - 53), inicio da semana domingo

%W
Número da semana do ano (00 - 53), comezo da semana luns

En consecuencia, "26 de setembro de 2019" é o nome completo do mes, data e ano. Este formato de data pódese describir usando os operadores do seguinte xeito:"%B %d, %Y".

En que:

  • %B - Nome completo do mes
  • %d — Número do día do mes
  • %Y - Designación do ano de catro díxitos

Ao describir o formato de data, é importante incluír todos os caracteres adicionais da súa cadea, como guións, comas, puntos, espazos, etc. No meu exemplo, "26 de setembro de 2019", hai unha coma despois da data e tamén cómpre poñer unha coma na descrición do formato:"%B %d, %Y".

Hai situacións nas que recibe unha data que non só non se corresponde con formatos estándar (AAAA-MM-DD ou AAAA/MM/DD), pero tamén nun idioma que é diferente do instalado por defecto no teu sistema operativo. Por exemplo, descargaches datos onde se indica a data así: "15 de decembro de 2019". Antes de converter esta cadea nunha data, cómpre cambiar a configuración rexional.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

Extracción de compoñentes de data en R básico

Non hai moitas funcións en R básico que che permitan extraer calquera parte dunha data dun obxecto de clase data.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

Ademais da clase de obxecto principal data en R básico hai 2 tipos de datos máis que almacenan unha marca de tempo: POSIXlt, POSIXct. A principal diferenza entre estas clases e data é que ademais da data gardan o tempo.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

Función Sys.time() devolve a data e a hora actual no formato POSIXct. Este formato ten un significado similar a UNIXTIME, e almacena o número de segundos desde o inicio da era UNIX (medianoite (UTC) do 31 de decembro de 1969 ao 1 de xaneiro de 1970).

Clase POSIXlt tamén almacena a hora e a data, e todos os seus compoñentes. Polo tanto, é un obxecto cunha estrutura máis complexa, pero do que é fácil obter calquera compoñente de data e hora porque de feito POSIXlt este 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  # часовой пояс

Converter datos numéricos e de texto a formatos POSIX* realizadas por funcións as.POSIXct() и as.POSIXlt(). Estas funcións teñen un pequeno conxunto de argumentos.

  • x — Número, cadea ou obxecto de clase data, que hai que converter;
  • tz — Zona horaria, por defecto "GMT";
  • format — Descrición do formato de data no que se representan os datos pasados ​​ao argumento x;
  • orixe — Úsase só ao converter un número a POSIX; debes pasar un obxecto de data e hora a partir dos cales se contan os segundos a este argumento. Normalmente úsase para traducir desde UNIXTIME.

Se a túa información de data e hora está en UNIXTIME, entón para convertelos nunha data clara e lexible, use o seguinte exemplo:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

En orixe pode especificar calquera marca de tempo. Por exemplo, se os teus datos conteñen a data e a hora como o número de segundos desde o 15 de setembro de 2019 ás 12:15, para convertelos nunha data utiliza:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

Traballar con dátiles usando o paquete de lubricado

lubridate Quizais o paquete máis popular para traballar con datas na linguaxe R. Ofrécelle tres clases adicionais.

  • duracións — duración, i.e. número de segundos entre dúas marcas de tempo;
  • períodos: os períodos permítenche facer cálculos entre datas en intervalos lexibles por humanos: días, meses, semanas, etc.
  • intervalos - obxectos que proporcionan o punto de inicio e final no tempo.

A instalación de paquetes adicionais na linguaxe R realízase mediante a función estándar install.packages().

Instalando o paquete lubridate:

install.packages("lubridate")

Converte texto a data usando lubridate

Características do paquete lubridate simplifica significativamente o proceso de conversión de texto nunha data e tamén permite realizar calquera operación aritmética con datas e horas.

As funcións axudarán a obter a data ou a data e hora actual today() и now().

today() # текущая дата
now()   # текущая дата и время

Para converter unha cadea nunha data en lubridate Hai toda unha familia de funcións cuxos nomes sempre constan de tres letras e indican a secuencia de compoñentes da data:

  • y - ano
  • m - mes
  • d - día

Lista de funcións para converter texto a data mediante lubridate

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Algúns exemplos para converter cadeas en datas:

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

Como podes ver lubridate É moito máis eficiente para recoñecer as descricións de datas como texto e permíteche converter texto en data sen utilizar operadores adicionais para describir o formato.

Extracción de compoñentes de data usando o paquete de lubricado

Tamén empregando lubridate podes obter calquera compoñente dunha data:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

Operacións aritméticas con datas

Pero a funcionalidade máis importante e básica lubridate é a capacidade de realizar varias operacións aritméticas con datas.

O arredondamento da data realízase mediante tres funcións:

  • floor_date - redondeando ao pretérito máis próximo
  • ceiling_date - redondeo ao tempo futuro próximo
  • round_date - redondeo á hora máis próxima

Cada unha destas funcións ten un argumento unidadeque permite especificar a unidade de redondeo: segundo, minuto, hora, día, semana, mes, bimes, trimestre, estación, semestre, ano

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") # округлить до полугодия

Entón, imos descubrir como obter unha data 8 días despois da data actual e facer outros cálculos aritméticos entre as dúas datas.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

Traballo simplificado con períodos, paquete timeperiodsR.

timeperiodsR — un novo paquete para traballar con datas que se publicou en CRAN en setembro de 2019.

Instalando o paquete timeperiodsR:

install.packages("timeperiodsR")

O obxectivo principal é determinar rapidamente un determinado intervalo de tempo relativo a unha data determinada. Por exemplo, usando as súas funcións pode facilmente:

  • Obtén a última semana, mes, trimestre ou ano en R.
  • Obtén un número especificado de intervalos de tempo relativos a unha data, por exemplo, as últimas 4 semanas.
  • É doado extraer os seus compoñentes do intervalo de tempo resultante: a data de inicio e finalización, o número de días incluídos no intervalo, toda a secuencia de datas que se inclúen nel.

Nome de todas as funcións do paquete timeperiodsR son intuitivas e constan de dúas partes: dirección_intervaloonde:

  • dirección no que cómpre moverse en relación a unha data determinada: last_n, previous, this, next, next_n.
  • temporal intervalo para calcular o período: día, semana, mes, trimestre, ano.

Conxunto completo de funcións:

  • 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 tempo en períodos de tempoR

Estas funcións son útiles nos casos en que necesites crear informes baseados nos datos da última semana ou mes. Para obter o último mes, usa a función do mesmo nome previous_month():

prmonth <- previous_month()

Despois diso, terás un obxecto prmes clase tpr, do que se poden obter facilmente os seguintes compoñentes:

  • a data de inicio do período, no noso exemplo este é o último mes
  • data de finalización do período
  • número de días incluídos no período
  • secuencia de datas incluídas no período

Ademais, podes obter cada un dos compoñentes de diferentes xeitos:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

Tamén podes obter calquera dos compoñentes usando o argumento parte, que está presente en cada unha das funcións do paquete. Valores posibles: inicio, fin, secuencia, lonxitude.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

Entón, vexamos todos os argumentos dispoñibles nas funcións do paquete timeperiodsR:

  • x — A data de referencia a partir da cal se calculará o período de tempo, a data actual por defecto;
  • n — O número de intervalos que se incluirán no período, por exemplo as 3 semanas anteriores;
  • part — Que compoñente do obxecto tpr cómpre obter, por defecto all;
  • week_start — O argumento só está presente nas funcións para traballar con semanas e permítelle establecer o número do día da semana que se considerará o seu inicio. Por defecto, o inicio da semana é o luns, pero pode definir calquera entre 1 - Luns a 7 - Domingo.

Así, podes calcular calquera período de tempo relativo á data actual ou a calquera outra data determinada; aquí tes algúns exemplos máis:

# получить 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

O 6 de outubro é domingo:
Traballar con datas en R (capacidades básicas, así como os paquetes lubridate e timeperiodsR)

Necesitamos un período que, en relación ao 6 de outubro, levará as 3 semanas anteriores. Sen incluír a semana que inclúe o propio 6 de outubro. En consecuencia, este é o período do 9 ao 29 de setembro.

Traballar con datas en R (capacidades básicas, así como os paquetes lubridate e timeperiodsR)

# получить месяц отстающий на 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

Neste exemplo, estamos interesados ​​no mes que foi hai 4 meses, se comezamos a partir do 16 de setembro de 2019, entón era maio de 2019.

Filtrando un vector de datas usando timeperiodsR

Para filtrar datas timeperiodsR Hai varios operadores:

  • %left_out% - compara dous obxectos de clase tpr e devolve o valor do esquerdo que falta no dereito.
  • %left_in% - compara dous obxectos da clase tpr e devolve as datas do obxecto da esquerda que están incluídos no dereito.
  • %right_out% - compara dous obxectos de clase tpr e devolve o valor do dereito que falta no esquerdo.
  • %right_in% - compara dous obxectos da clase tpr e devolve as datas do obxecto da dereita que están presentes no esquerdo.

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

No paquete timeperiodsR hai un oficial en ruso Lista de reprodución de YouTube.

Conclusión

Examinamos en detalle as clases de obxectos que se deseñan na linguaxe R para traballar con datas. Tamén agora pode realizar operacións aritméticas sobre datas e obter rapidamente calquera período de tempo usando o paquete timeperiodsR.

Se estás interesado no idioma R, convídote a subscribirte á miña canle de telegram R4 marketing, na que comparto a diario materiais útiles sobre o uso da linguaxe R na resolución dos teus problemas cotiáns.

Fonte: www.habr.com

Engadir un comentario