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.

Conteúdo
Se você está interessado em análise de dados e, em particular, na linguagem R, talvez você se interesse pelos meus e canais. A maior parte do conteúdo deles é dedicado à linguagem R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
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 anoAlé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 atualPara 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 semanaOperaçõ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óximoceiling_date— arredondamento para o momento futuro mais próximoround_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 semestreAgora, 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 anosTrabalho 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íodoEntã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 objetotprvocê precisa obter, por padrãoall;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, domingo6 de outubro é domingo:

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.

# получить месяц отстающий на 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-feiraNeste 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 period1Do pacote timeperiodsR há uma versão oficial em russo .
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 , onde compartilho diariamente materiais úteis sobre a aplicação da linguagem R na resolução de minhas tarefas cotidianas.
Fonte: habr.com
