Trabalhando com datas em R (recursos básicos, bem como os pacotes lubridate e timeperiodsR)

Obtenha a data atual em qualquer linguagem de programação, uma operação equivalente a "Olá, mundo!" A linguagem R não é exceção.

Neste artigo, veremos como funciona o trabalho com datas na sintaxe básica da linguagem R e também vários pacotes úteis que expandem seus recursos ao trabalhar com datas:

  • lubridate — um pacote que permite realizar cálculos aritméticos entre datas;
  • timeperiodsR — um pacote para trabalhar com intervalos de tempo e seus componentes.

Trabalhando com datas em R (recursos básicos, bem como os pacotes lubridate e timeperiodsR)

Conteúdo

Se você está interessado em análise de dados, e em particular na linguagem R, você pode estar interessado em meu telegrama и Youtube canais. A maior parte do conteúdo é dedicada à linguagem R.

  1. Trabalhando com datas na sintaxe R básica
    1.1. Converter texto em data
    1.2. Extraindo componentes de data em R básico
  2. Trabalhando com datas usando o pacote lubridate
    2.1. Converter texto atualizado usando lubridate
    2.2. Extraindo componentes de data usando o pacote lubridate
    2.3. Operações aritméticas com datas
  3. Trabalho simplificado com períodos, pacote timeperiodsR
    3.1. Intervalos de tempo em períodos de tempoR
    3.2. Filtrando um vetor de datas usando timeperiodsR
  4. Conclusão

Trabalhando com datas na sintaxe R básica

Converter texto em data

Basic R possui um conjunto de funções para trabalhar com datas. A desvantagem da sintaxe básica é que o caso dos nomes e argumentos das funções é muito disperso e praticamente não tem conexão lógica. Porém, você precisa conhecer as funções básicas da linguagem, por isso começaremos por elas.

Na maioria das vezes, ao carregar dados em R, de arquivos CSV ou de outras fontes, você recebe uma data como texto. Para converter este texto para o tipo de dados correto, use a função 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 padrão as.Date() aceita data em dois formatos: AAAA-MM-DD ou AAAA/MM/DD.
Se o seu conjunto de dados contiver datas em algum outro formato, você poderá usar o argumento format.

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

formato aceita operadores em forma de string denotando qualquer intervalo de tempo e seu formato; os valores mais comumente usados ​​são mostrados na tabela abaixo:

Formato
descrição

%d
Número do dia no mês

%a
Abreviação do nome do dia da semana

%A
Nome completo do dia da semana

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

%m
Designação de mês de dois dígitos (01-12)

%b
Abreviatura do nome do mês (abril, março, …)

%B
Nome completo do mês

%y
Designação de ano de dois dígitos

%Y
Designação de ano de quatro dígitos

%j
Número do dia no ano (001 - 366)

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

%W
Número da semana no ano (00 - 53), início da semana segunda-feira

Assim, “26 de setembro de 2019” é o nome completo do mês, data e ano. Este formato de data pode ser descrito usando operadores como segue:"%B %d, %Y".

Em que:

  • %B — Nome completo do mês
  • %d — Número do dia do mês
  • %Y — Designação de ano com quatro dígitos

Ao descrever o formato da data, é importante incluir todos os caracteres adicionais da sua string, como travessões, vírgulas, pontos, espaços e assim por diante. No meu exemplo, “26 de setembro de 2019”, há uma vírgula após a data, e você também precisa colocar uma vírgula na descrição do formato:"%B %d, %Y".

Há situações em que você recebe uma data que não só não corresponde aos formatos padrão (AAAA-MM-DD ou AAAA/MM/DD), mas também em um idioma diferente do idioma padrão instalado em seu sistema operacional. Por exemplo, você baixou dados onde a data é indicada assim: “15 de dezembro de 2019”. Antes de converter esta string em uma data, você precisa alterar a localidade.

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

Extraindo componentes de data em R básico

Não existem muitas funções no R básico que permitem extrair qualquer parte de uma data de um objeto de classe Data.

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

Além da classe de objeto principal Data no R básico, existem mais 2 tipos de dados que armazenam um carimbo de data/hora: POSIXlt, POSIXct. A principal diferença entre essas classes e Data é que além da data eles armazenam a hora.

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

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

# "POSIXct" "POSIXt"

Função Sys.time() retorna a data e hora atuais no formato POSIXct. Este formato é semelhante em significado a UNIXTIME, e armazena o número de segundos desde o início da era UNIX (meia-noite (UTC) de 31 de dezembro de 1969 a 1º de janeiro de 1970).

Classe POSIXlt também armazena a hora e a data e todos os seus componentes. Portanto, é um objeto com uma estrutura mais complexa, mas do qual é fácil obter qualquer componente de data e hora porque na verdade POSIXlt это 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  # часовой пояс

Convertendo dados numéricos e de texto em formatos POSIX* realizado por funções as.POSIXct() и as.POSIXlt(). Essas funções possuem um pequeno conjunto de argumentos.

  • x — Número, string ou objeto de classe Data, que precisa ser convertido;
  • tz — Fuso horário, padrão "GMT";
  • format — Descrição do formato da data em que os dados passados ​​para o argumento x são representados;
  • origin — Usado apenas ao converter um número para POSIX; você deve passar um objeto de data e hora a partir da qual os segundos são contados neste argumento. Normalmente usado para tradução do UNIXTIME.

Se suas informações de data e hora estiverem em UNIXTIME, para convertê-los em uma data clara e legível, use o seguinte exemplo:

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

Na origem você pode especificar qualquer carimbo de data/hora. Por exemplo, se seus dados contiverem a data e a hora como o número de segundos desde 15 de setembro de 2019 às 12h15, para convertê-los em uma data, use:

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

Trabalhando com datas usando o pacote lubridate

lubridate Talvez o pacote mais popular para trabalhar com datas na linguagem R. Ele fornece três classes adicionais.

  • durações - duração, ou seja, número de segundos entre dois carimbos de data/hora;
  • períodos - os períodos permitem fazer cálculos entre datas em intervalos legíveis: dias, meses, semanas e assim por diante;
  • intervalos - objetos que fornecem o ponto inicial e final no tempo.

A instalação de pacotes adicionais na linguagem R é realizada usando a função padrão install.packages().

Instalando o pacote lubridate:

install.packages("lubridate")

Converter texto atualizado usando lubridate

Recursos do pacote lubridate simplificar significativamente o processo de conversão de texto em data e também permitir realizar quaisquer operações aritméticas com datas e horas.

As funções irão ajudá-lo a obter a data atual ou data e hora today() и now().

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

Para converter uma string em uma data em lubridate Existe toda uma família de funções cujos nomes consistem sempre em três letras e indicam a sequência dos componentes da data:

  • você - ano
  • m - mês
  • dia d

Lista de funções para converter texto em data via lubridate

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

Alguns exemplos de conversão de strings em datas:

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

Como você vê lubridate É muito mais eficiente no reconhecimento de descrições de datas como texto e permite converter texto em data sem usar operadores adicionais para descrever o formato.

Extraindo componentes de data usando o pacote lubridate

Também usando lubridate você pode obter qualquer componente de uma data:

dt <- ymd("2017 jan 21")

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

Operações aritméticas com datas

Mas a funcionalidade mais importante e básica lubridate é a capacidade de realizar várias operações aritméticas com datas.

O arredondamento de datas é realizado por três funções:

  • floor_date - arredondando para o pretérito mais próximo
  • ceiling_date - arredondando para o futuro próximo
  • round_date - arredondando para o horário mais próximo

Cada uma dessas funções tem um argumento unidadeque permite especificar a unidade de arredondamento: segundo, minuto, hora, dia, semana, mês, bimês, trimestre, estação, 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ão, vamos descobrir como obter uma data 8 dias após a data atual e fazer vários outros cálculos aritméticos entre as duas datas.

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

Trabalho simplificado com períodos, pacote timeperiodsR.

timeperiodsR — um novo pacote para trabalhar com datas que foi publicado no CRAN em setembro de 2019.

Instalando o pacote timeperiodsR:

install.packages("timeperiodsR")

O objetivo principal é determinar rapidamente um determinado intervalo de tempo relativo a uma determinada data. Por exemplo, usando suas funções você pode facilmente:

  • Obtenha a última semana, mês, trimestre ou ano em R.
  • Obtenha um número especificado de intervalos de tempo relativos a uma data, por exemplo, as últimas 4 semanas.
  • Do intervalo de tempo resultante é fácil extrair seus componentes: a data de início e término, o número de dias incluídos no intervalo, toda a sequência de datas nele incluídas.

Nome de todas as funções do pacote timeperiodsR são intuitivos e consistem em duas partes: direção_intervalo, onde:

  • direção em que você precisa se mover em relação a uma determinada data: last_n, previous, this, next, next_n.
  • temporário intervalo para calcular o período: dia, semana, mês, trimestre, ano.

Conjunto completo de recursos:

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

Essas funções são úteis nos casos em que você precisa construir relatórios com base nos dados da semana ou mês anterior. Para obter o último mês, use a função de mesmo nome previous_month():

prmonth <- previous_month()

Depois disso você terá um objeto mês classe tpr, a partir do qual os seguintes componentes podem ser facilmente obtidos:

  • a data de início do período, no nosso exemplo este é o último mês
  • data de término do período
  • número de dias incluídos no período
  • sequência de datas incluídas no período

Além disso, você pode obter cada um dos componentes de diferentes maneiras:

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

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

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

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

Você também pode obter qualquer um dos componentes usando o argumento parte, que está presente em cada uma das funções do pacote. Valores possíveis: início, fim, sequência, comprimento.

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

Então, vamos dar uma olhada em todos os argumentos disponíveis nas funções do pacote timeperiodsR:

  • x — A data de referência a partir da qual o período será calculado, a data atual por defeito;
  • n — O número de intervalos que serão incluídos no período, por exemplo, as 3 semanas anteriores;
  • part — Qual componente do objeto tpr você precisa obter, por padrão all;
  • week_start — O argumento está presente apenas em funções para trabalhar com semanas, e permite definir o número do dia da semana que será considerado seu início. Por padrão, o início da semana é segunda-feira, mas você pode definir qualquer um a partir de 1 - Segunda a 7 - Domingo.

Assim, você pode calcular qualquer período de tempo relativo à data atual ou qualquer outra data; aqui estão mais alguns exemplos:

# получить 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 outubro é domingo:
Trabalhando com datas em R (recursos básicos, bem como os pacotes lubridate e timeperiodsR)

Precisamos de um período que, relativamente a 6 de outubro, dure as 3 semanas anteriores. Sem incluir a semana que inclui o próprio dia 6 de outubro. Assim, este é o período de 9 a 29 de setembro.

Trabalhando com datas em R (recursos básicos, bem como os pacotes 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 interessados ​​no mês que foi há 4 meses, se partirmos de 16 de setembro de 2019, então foi maio de 2019.

Filtrando um vetor de datas usando timeperiodsR

Para filtrar datas em timeperiodsR Existem vários operadores:

  • %left_out% - compara dois objetos da classe tpr e retorna o valor do esquerdo que está faltando no direito.
  • %left_in% - compara dois objetos da classe tpr e retorna as datas do objeto esquerdo que estão incluídas no objeto direito.
  • %right_out% - compara dois objetos da classe tpr e retorna o valor do direito que está faltando no esquerdo.
  • %right_in% - compara dois objetos da classe tpr e retorna datas do objeto direito que estão presentes no objeto 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 pacote timeperiodsR existe um oficial em russo Lista de reprodução do YouTube.

Conclusão

Examinamos detalhadamente as classes de objetos projetadas na linguagem R para trabalhar com datas. Além disso, agora você pode realizar operações aritméticas em datas e obter rapidamente quaisquer períodos de tempo usando o pacote timeperiodsR.

Se você está interessado na linguagem R, convido você a se inscrever no meu canal de telegram R4marketing, no qual compartilho diariamente materiais úteis sobre como usar a linguagem R na solução de seus problemas diários.

Fonte: habr.com

Adicionar um comentário