Trabalhando com datas na linguagem R (funcionalidades básicas, bem como os pacotes lubridate e timeperiodsR)

Obter a data atual em qualquer linguagem de programação é equivalente a "Hello world!". A linguagem R não é uma exceção.

Neste artigo, vamos explorar como funciona o trabalho com datas na sintaxe básica da linguagem R, além de considerarmos alguns pacotes úteis que expandem suas capacidades 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 na linguagem R (funcionalidades básicas, bem como os pacotes lubridate e timeperiodsR)

Conteúdo

Se você está interessado em análise de dados e, em particular, na linguagem R, talvez você se interesse pelos meus telegram e canais. A maior parte do conteúdo é dedicada à linguagem R. canais. A maior parte do conteúdo deles é dedicado à linguagem R.

  1. Trabalho com datas na sintaxe básica R
    1.1. Conversão de texto em data
    1.2. Extraindo componentes da data no R básico
  2. Trabalho com datas usando o pacote lubridate
    2.1. Conversão de texto em data com lubridate
    2.2. Extraindo componentes de datas com 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 timeperiodsR
    3.2. Filtragem de vetor de datas com timeperiodsR
  4. Conclusão

Trabalho com datas na sintaxe básica R

Conversão de texto em data

No R básico, existe um conjunto de funções para trabalhar com datas. A desvantagem da sintaxe básica é que o registro de nomes e argumentos das funções é bastante fragmentado e praticamente não tem conexão lógica. No entanto, é importante conhecer as funções básicas da linguagem, então começaremos exatamente por elas.

Ao carregar dados no R, a partir de arquivos csv ou de outras fontes, você frequentemente recebe a data como texto. Para converter esse 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() que aceita a data em dois formatos: AAAA-MM-DD ou AAAA/MM/DD.
Se em seu conjunto de dados as datas estão apresentadas em algum outro formato, você pode usar o argumento format.

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

format aceita em formato de string operadores que representam algum intervalo de tempo e seu formato, os valores mais frequentemente utilizados estão listados 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
Indicação de mês em dois dígitos (01-12)

%b
Abreviação do nome do mês (abr, mar, …)

%B
Nome completo do mês

%y
Indicação do ano em dois dígitos

%Y
Indicação do ano em quatro dígitos

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

%U
Número da semana no ano (00 — 53), início da semana Domingo

%W
Número da semana no ano (00 — 53), início da semana Segunda

Portanto, "26 de setembro de 2019" é — o nome completo do mês, dia e ano. Descrever esse formato de data com operadores pode ser feito assim:"%B %d, %Y".

Onde:

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

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

Há situações em que você recebe uma data que não corresponde apenas a formatos padrão (AAAA-MM-DD ou AAAA/MM/DD), mas também em um idioma diferente do configurado por padrão no seu sistema operacional. Por exemplo, você carregou dados onde a data é apresentada assim: "15 de dezembro de 2019". Antes de converter essa string em uma data, você precisa alterar a localidade.

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

Extraindo componentes da data no R básico

No R básico, não há muitas funções que permitem extrair qualquer parte da data de um objeto da classe Date.

current_date <- Sys.Date() # data atual
weekdays(current_date)     # obter número do dia da semana
months(current_date)       # obter número do mês no ano
quarters(current_date)     # obter número do trimestre no ano

Além da classe principal de objetos Date no R básico, há também 2 tipos de dados que armazenam marcação de tempo: POSIXlt, POSIXct. A principal diferença dessas classes em relação a Date é que, além da data, elas armazenam o tempo.

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

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

# "POSIXct" "POSIXt"

Função Sys.time() retorna a data e hora atuais no formato POSIXct. Esse formato é semelhante ao UNIXTIME, e armazena a quantidade de segundos desde o início da era UNIX (meia-noite (UTC) de 31 de dezembro de 1969 até 1 de janeiro de 1970).

Classe POSIXlt também armazena o tempo 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 tempo, já que, essencialmente, POSIXlt isso 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  # часовой пояс

A conversão de dados numéricos e textuais para formatos POSIX* é realizada pelas funções as.POSIXct() e as.POSIXlt(). Essas funções têm um conjunto pequeno de argumentos.

  • x — Número, string ou objeto da classe Date, que precisa ser convertido;
  • tz — Fuso horário, por padrão "GMT";
  • format — Descrição do formato da data na qual os dados passados no argumento x estão representados;
  • origin — Usado apenas na conversão de um número para POSIX, você deve passar um objeto de data e hora do qual a contagem de segundos começa. Geralmente, é usado para a conversão de UNIXTIME.

Se os seus dados sobre data e hora estiverem representados em UNIXTIME, então para convertê-los em uma data compreensível e legível, use o seguinte exemplo:

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

No origin, você pode especificar qualquer timestamp. Por exemplo, se em seus dados, a data e a hora estiverem indicadas como um número de segundos a partir de 15 de setembro de 2019 às 12:15, para transformá-los em uma data, use:

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

Trabalho com datas usando o pacote lubridate

lubridate é provavelmente o pacote mais popular para trabalhar com datas na linguagem R. Ele fornece ainda mais três classes.

  • durations — duração, ou seja, o número de segundos entre dois timestamps;
  • periods — os períodos permitem cálculos entre datas em intervalos compreensíveis para os humanos: dias, meses, semanas e assim por diante;
  • intervals — objetos que fornecem o momento inicial e final do tempo.

A instalação de pacotes adicionais na linguagem R é feita pela função padrão install.packages().

Instalação do pacote lubridate:

install.packages("lubridate")

Conversão de texto em data com lubridate

As funções do pacote lubridate simplificam significativamente o processo de conversão de texto em data, além de permitir que você realize quaisquer operações aritméticas com datas e horas.

Para obter a data atual ou a data e hora, você pode usar as funções today() e now().

today() # data atual
now()   # data e hora atual

Para converter uma string em data em lubridate existe um verdadeiro conjunto de funções cujos nomes sempre consistem em três letras, representando a sequência de componentes da data:

  • y — ano
  • m — mês
  • d — dia

Lista de funções para converter texto em data através do lubridate

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

Alguns exemplos para converter strings em datas:

ymd("2017 jan 21")
mdy("20 de março de 2019")
dmy("1 de abril de 2018")

Como você pode ver, lubridate é significativamente mais eficiente em reconhecer descrições de datas em formato de texto, permitindo que você converta texto em data sem usar operadores adicionais para descrever o formato.

Extraindo componentes de datas com o pacote lubridate

Além disso, lubridate você pode obter qualquer componente de uma data:

dt <- ymd("2017 jan 21")

year(dt)  # ano
month(dt) # mês
mday(dt)  # dia do mês
yday(dt)  # dia do ano
wday(dt)  # dia da semana

Operações aritméticas com datas

Mas, a funcionalidade mais importante e essencial lubridate consiste na capacidade de realizar várias operações aritméticas com datas.

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

  • floor_date — arredondamento para o momento passado mais próximo
  • ceiling_date — arredondamento para o momento futuro mais próximo
  • round_date — arredondamento para o momento mais próximo

Cada uma dessas funções possui um argumento um arquivo, que permite especificar a unidade de arredondamento: segundo, minuto, hora, dia, semana, mês, bimestre, trimestre, estação, semestre, ano

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # arredondar para o mês
round_date(dt, unit = "3 month")  # arredondar para 3 meses
round_date(dt, unit = "quarter")  # arredondar para o trimestre
round_date(dt, unit = "season")   # arredondar para a estação
round_date(dt, unit = "halfyear") # arredondar para o semestre

Agora, vamos ver como obter uma data que será 8 dias após a data atual e realizar vários outros cálculos aritméticos entre duas datas.

today() + days(8)   # que data será em 8 dias
today() - months(2) # que data foi há 2 meses
today() + weeks(12) # que data será em 12 semanas
today() - years(2)  # que data foi há 2 anos

Trabalho simplificado com períodos, pacote timeperiodsR.

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

Instalação do pacote timeperiodsR:

install.packages("timeperiodsR")

O principal objetivo é a rápida determinação de um determinado intervalo de tempo em relação a uma data dada. Por exemplo, com suas funções, você pode facilmente:

  • Obter a semana, mês, trimestre ou ano passado em R.
  • Obter um determinado número de intervalos de tempo em relação a uma data, como as últimas 4 semanas.
  • Extrair facilmente os componentes do intervalo de tempo obtido: a data de início e fim, a quantidade de dias incluídos no intervalo, toda a sequência de datas que ele inclui.

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

  • direção em que é necessário mover-se em relação à data dada: last_n, previous, this, next, next_n.
  • temporal intervalo para calcular o período: dia, semana, mês, trimestre, ano.

Um conjunto completo de funções:

  • 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 timeperiodsR

Essas funções são úteis em situações em que você precisa gerar relatórios com base em dados da semana ou mês passado. Para obter o mês anterior, use a função homônima previous_month():

prmonth <- previous_month()

Depois disso você terá um objeto prmonth classe tpr, a partir do qual é fácil obter os seguintes componentes:

  • data de início do período, no nosso exemplo, é o mês passado
  • data de término do período
  • número de dias que fazem parte do período
  • sequência de datas que fazem parte do período

Além disso, você pode obter qualquer um dos componentes utilizando o argumento

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

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

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

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

part part, que está presente em cada uma das funções do pacote. Possíveis valores: start, end, sequence, length.

previous_month(part = "start")    # início do período
previous_month(part = "end")      # fim do período
previous_month(part = "sequence") # sequência de datas
previous_month(part = "length")   # número de dias no período

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

  • x — Data de referência a partir da qual o período será calculado, por padrão a data atual;
  • n — Número de intervalos que farão parte do período, por exemplo, 3 semanas anteriores;
  • part — Qual componente do objeto tpr você precisa obter, por padrão all;
  • week_start — O argumento está presente apenas nas funções que lidam com semanas, e permite definir o número do dia da semana que será considerado como início, por padrão o início da semana é segunda-feira, mas você pode definir qualquer um de 1 — segunda-feira a 7 — domingo.

Assim, você pode calcular qualquer período de tempo em relação à data atual ou qualquer outra data específica, veja mais alguns exemplos:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Período de tempo: de 9 de setembro de 2019, segunda-feira, a 29 de setembro de 2019, domingo

6 de outubro é domingo:
Trabalhando com datas na linguagem R (funcionalidades básicas, bem como os pacotes lubridate e timeperiodsR)

Precisamos de um período que, em relação a 6 de outubro, pegue 3 semanas anteriores. Não incluindo a semana que contém o próprio 6 de outubro. Portanto, é o período de 9 a 29 de setembro.

Trabalhando com datas na linguagem R (funcionalidades básicas, bem como os pacotes lubridate e timeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Período de tempo: de 1 de maio de 2019, quarta-feira, a 31 de maio de 2019, sexta-feira

Neste exemplo, estamos interessados no mês que foi há 4 meses, considerando 16 de setembro de 2019, portanto, foi maio de 2019.

Filtragem de vetor de datas com timeperiodsR

Para filtrar datas em timeperiodsR existem vários operadores:

  • %left_out% — compara dois objetos da classe tpr, e retorna valores do esquerdo que estão ausentes do direito.
  • %left_in% — compara dois objetos da classe tpr, e retorna datas do objeto esquerdo que estão dentro do direito.
  • %right_out% — compara dois objetos da classe tpr, e retorna valores do direito que estão ausentes do esquerdo.
  • %right_in% – compara dois objetos da classe tpr e retorna as datas do objeto da direita que estão presentes no da esquerda.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # obter datas de period1 que estão em period2
period1 %left_out% period2  # obter datas de period1 que não estão em period2
period1 %right_in% period2  # obter datas de period2 que estão em period1
period1 %right_out% period2 # obter datas de period2 que não estão em period1

Do pacote timeperiodsR há uma versão oficial em russo playlist no YouTube.

Conclusão

Analisamos em detalhes as classes de objetos que são projetadas na linguagem R para trabalhar com datas. Agora, você também sabe realizar operações aritméticas sobre datas e rapidamente obter quaisquer períodos de tempo usando o pacote timeperiodsR.

Se você está interessado na linguagem R, convido você a se inscrever no meu canal do Telegram R4marketing, onde compartilho diariamente materiais úteis sobre a aplicação da linguagem R na resolução de minhas tarefas cotidianas.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster