Trabalhando com datas no idioma R (recursos bĂĄsicos, bem como pacotes de lubridate e timeperiodsR)

Obtenha a data atual em qualquer linguagem de programação, uma operação equivalente a "Hello world!" O idioma R não é exceção.


Neste artigo, entenderemos como o trabalho com datas Ă© organizado na sintaxe bĂĄsica da linguagem R e tambĂ©m consideraremos vĂĄrios pacotes Ășteis que expandem seus recursos ao trabalhar com datas:


  • lubridate - um pacote que permite cĂĄlculos aritmĂ©ticos entre datas;
  • timeperiodsR - um pacote para trabalhar com intervalos de tempo e seus componentes.




ConteĂșdo


  1. Trabalhando com datas na sintaxe R bĂĄsica
    1.1 Converter texto em data
    1.2 Recuperando componentes de data na base R
  2. Trabalhando com datas com o pacote de lubrificado
    2.1 Converter texto em data usando lubrificado
    2.2 Recuperando componentes de data usando pacote de lubrificado
    2.3 OperaçÔes aritméticas com datas
  3. Trabalho simplificado com perĂ­odos, perĂ­odo de tempoR pacote
    3.1 Intervalos de tempo em perĂ­odos de tempoR
    3.2 Filtrando um vetor de data com timeperiodsR
  4. ConclusĂŁo



Trabalhando com datas na sintaxe R bĂĄsica


Converter texto em data


No R båsico, hå um conjunto de funçÔes para trabalhar com datas. O ponto negativo da sintaxe båsica é que o registro de nomes e argumentos de funçÔes é muito fragmentado e praticamente não possui conexão lógica. No entanto, as funçÔes båsicas da linguagem devem ser conhecidas, portanto, começaremos com elas.


Na maioria das vezes, ao carregar dados no R, de arquivos csv ou outras fontes, vocĂȘ obtĂ©m a data na forma de texto. Para as.Date() esse texto no 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 uma data em dois formatos: AAAA-MM-DD ou AAAA / MM / DD .
Se as datas no seu conjunto de dados estiverem em qualquer outro formato, vocĂȘ poderĂĄ usar o argumento de format para conversĂŁo.


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

O formato aceita operadores em forma de cadeia, indicando qualquer intervalo de tempo e seu formato, os valores mais frequentemente usados ​​são mostrados na tabela abaixo:


FormatarDescrição do produto
% dNĂșmero do dia no mĂȘs
% aAbreviação para o nome do dia da semana
% ANome completo do dia da semana
% wNĂșmero do dia da semana (0-6, onde 0 Ă© domingo)
% mDesignação de dois dĂ­gitos para o mĂȘs (01-12)
% bAbreviação do nome do mĂȘs (abril, março, ...)
% BNome completo do mĂȘs
% yDesignação do ano com dois dígitos
% YDesignação do ano com quatro dígitos
% jNĂșmero do dia do ano (001 - 366)
% UNĂșmero da semana do ano (00 - 53), inĂ­cio da semana domingo
% WNĂșmero da semana do ano (00 - 53), inĂ­cio da semana segunda-feira

Assim, "26 de setembro de 2019" Ă© o nome completo do mĂȘs, dia e ano. VocĂȘ pode descrever esse formato de data com os operadores da seguinte maneira: "%B %d, %Y" .


Onde:


  • %B - nome completo do mĂȘs
  • %d - nĂșmero do dia no mĂȘs
  • %Y - Designação do ano com quatro dĂ­gitos

Ao descrever o formato da data, Ă© importante incluir todos os caracteres adicionais da sua sequĂȘncia, como traços, vĂ­rgulas, pontos, espaços e assim por diante. No meu exemplo, "26 de setembro de 2019", uma vĂ­rgula Ă© colocada apĂłs a data e tambĂ©m deve ser colocada na descrição do formato: "%B %d, %Y" .


HĂĄ situaçÔes em que vocĂȘ obtĂ©m uma data que nĂŁo Ă© apenas inadequada para os formatos padrĂŁo (AAAA-MM-DD ou AAAA / MM / DD) , mas tambĂ©m em um idioma que difere da configuração padrĂŁo no seu sistema operacional. Por exemplo, vocĂȘ baixou dados em que a data Ă© indicada no seguinte formulĂĄrio: "15 de dezembro de 2019". Antes de converter essa sequĂȘncia em uma data, vocĂȘ precisa alterar o cĂłdigo do idioma.


 #   Sys.setlocale("LC_TIME", "Russian") #     as.Date(" 15, 2019 .", format = "%B %d, %Y") 

Recuperando componentes de data na base R


Não hå muitas funçÔes no R båsico que permitem extrair qualquer parte de uma data de um objeto da classe Date .


 current_date <- Sys.Date() #   weekdays(current_date) #     months(current_date) #      quarters(current_date) #      

Além da classe principal de objetos Date na base R, existem mais 2 tipos de dados que armazenam o registro de data e hora: POSIXlt , POSIXct . A principal diferença entre essas classes e Data é que elas armazenam hora além da data.


 #      current_time <- Sys.time() #    current_time class(current_time) 

 # "POSIXct" "POSIXt" 

A função Sys.time() retorna a data e hora atuais no formato POSIXct . Esse formato tem significado semelhante ao 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) .


A classe POSIXlt também armazena a hora e a data e todos os seus componentes. Portanto, é um objeto com uma estrutura mais complexa, mas a partir da qual é fåcil obter qualquer componente da data e hora desde essencialmente POSIXlt é uma 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 #   

A conversĂŁo de dados numĂ©ricos e de texto em formatos POSIX * Ă© realizada pelas funçÔes as.POSIXct() e as.POSIXlt() . Essas funçÔes tĂȘm um pequeno conjunto de argumentos.


  • x - O nĂșmero, sequĂȘncia ou objeto da classe Date a ser convertida;
  • tz - Fuso horĂĄrio, o padrĂŁo Ă© "GMT";
  • formato - Descrição do formato da data em que os dados passados ​​no argumento x sĂŁo apresentados;
  • origem - Usado apenas ao converter um nĂșmero para POSIX, vocĂȘ precisa passar um objeto de data para esse argumento e a hora em que os segundos sĂŁo contados. Normalmente usado para tradução de UNIXTIME.

Se seus dados de data e hora forem apresentados em UNIXTIME , use o exemplo a seguir para convertĂȘ-los em uma data compreensĂ­vel e legĂ­vel:


 #  UNIXTIME    as.POSIXlt(1570084639, origin = "1970-01-01") 

Na origem, vocĂȘ pode especificar qualquer registro de data e hora. Por exemplo, se nos seus dados a data e a hora estiverem indicados como o nĂșmero de segundos a partir de 15 de setembro de 2019 12:15, 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 com o pacote de lubrificado


talvez o lubridate seja o pacote mais popular para trabalhar com datas em R. Ele fornece mais trĂȘs classes adicionais.


  • duraçÔes - duração, ou seja, nĂșmero de segundos entre dois carimbos de data e hora;
  • perĂ­odos - perĂ­odos permitem realizar cĂĄlculos entre datas de intervalos legĂ­veis por humanos: 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 pela função padrão install.packages() .


Instalando o pacote de lubridate :


 install.packages("lubridate") 

Converter texto em data usando lubrificado


As funçÔes do pacote de lubridate simplificam bastante o processo de conversão de texto em data e também permitem realizar operaçÔes aritméticas com datas e horas.


As funçÔes today() e now() ajudarĂŁo vocĂȘ a obter a data atual, ou data e hora.


 today() #   now() #     

Para converter uma string em uma data, o lubridate possui uma famĂ­lia inteira de funçÔes cujos nomes sempre consistem em trĂȘs letras e indicam uma sequĂȘncia de componentes de data:


  • y - ano
  • m - mĂȘs
  • d - dia

Lista de funçÔes para converter texto em data via lubrificado
  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Alguns exemplos para converter seqĂŒĂȘncias de caracteres em datas:


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

Como vocĂȘ pode ver, o lubridate muito mais eficiente no reconhecimento de descriçÔes de data na forma de texto e permite converter texto em data sem usar operadores adicionais para descrever o formato.


Recuperando componentes de data usando pacote de lubrificado


TambĂ©m usando lubridate vocĂȘ pode obter qualquer componente a partir de uma data:


 dt <- ymd("2017 jan 21") year(dt) #  month(dt) #  mday(dt) #    yday(dt) #    wday(dt) #   

OperaçÔes aritméticas com datas


Porém, a funcionalidade mais importante e båsica do lubridate é a capacidade de executar vårias operaçÔes aritméticas com datas.


O arredondamento de uma data Ă© realizado por trĂȘs funçÔes:


  • floor_date - arredondando para o horĂĄrio passado 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 possui um argumento de unidade , que permite especificar uma unidade de arredondamento: segundo, minuto, hora, dia, semana, mĂȘs, bimestre, trimestre, estação, semestral, 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 que serå 8 dias após a data atual e realizar vårios outros cålculos aritméticos entre 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 publicadas no CRAN em setembro de 2019.


Instalando o pacote timeperiodsR :


 install.packages("timeperiodsR") 

O objetivo principal Ă© determinar rapidamente um determinado intervalo de tempo em relação a uma determinada data. Por exemplo, usando suas funçÔes, vocĂȘ pode facilmente:


  • Receba semana passada, mĂȘs, trimestre ou ano em R.
  • Obtenha um determinado nĂșmero de intervalos de tempo em relação a uma data, como as Ășltimas 4 semanas.
  • É fĂĄcil extrair seus componentes do intervalo de tempo obtido: as datas de inĂ­cio e tĂ©rmino, o nĂșmero de dias que se enquadram no intervalo, toda a sequĂȘncia de datas que o inserem.

O nome de todas as funçÔes do pacote timeperiodsR intuitivo e consiste em duas partes: direction _ interval , em que:


  • direção na qual Ă© necessĂĄrio mover em relação a uma determinada data: last_n, previous, this, next, next_n.
  • intervalo de tempo 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 quando vocĂȘ precisa criar relatĂłrios com base nos dados da Ășltima semana ou mĂȘs. Para obter o Ășltimo mĂȘs, use a função com o mesmo nome previous_month() :


 prmonth <- previous_month() 

ApĂłs o qual vocĂȘ terĂĄ um objeto prprth da classe tpr , do qual vocĂȘ poderĂĄ obter facilmente os seguintes componentes:


  • a data de inĂ­cio do perĂ­odo, em nosso exemplo, este Ă© o Ășltimo mĂȘs
  • data de tĂ©rmino do perĂ­odo
  • o 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 maneiras diferentes:


 #    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 part , 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, vejamos 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; por padrĂŁo, a data atual;
  • n - O nĂșmero de intervalos que serĂŁo incluĂ­dos no 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 para trabalhar com semanas e permite especificar 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 especificar de 1 - segunda a 7 - domingo.

Assim, vocĂȘ pode calcular qualquer perĂ­odo de tempo relativo Ă  data atual ou qualquer outra data, darei 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:
6 de outubro de 2019


Precisamos de um perĂ­odo que, em relação a 6 de outubro, leve trĂȘs semanas anteriores. NĂŁo incluindo a semana de 6 de outubro. Portanto, este Ă© o perĂ­odo de 9 a 29 de setembro.


3 semanas a partir de 6 de outubro de 2019




 #     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 prosseguirmos em 16 de setembro de 2019, portanto, era em maio de 2019.


Filtrando um vetor de data com timeperiodsR


Existem vĂĄrios operadores para filtrar datas nos timeperiodsR :


  • % left_out% - compara dois objetos da classe tpr e retorna o valor da esquerda, que nĂŁo estĂĄ Ă  direita.
  • % left_in% - compara dois objetos da classe tpr e retorna datas do objeto esquerdo que estĂŁo incluĂ­das no direito.
  • % right_out% - compara dois objetos da classe tpr e retorna o valor da direita, que estĂĄ ausente na esquerda.
  • % right_in% - compara dois objetos da classe tpr e retorna as datas do objeto direito que estĂŁo 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 

ConclusĂŁo


Examinamos detalhadamente as classes de objetos projetados na linguagem R para trabalhar com datas. Agora também é possível executar operaçÔes aritméticas em datas e obter rapidamente períodos de tempo usando o pacote timeperiodsR .


Se vocĂȘ estĂĄ interessado na linguagem R, convido vocĂȘ a assinar o meu canal de telegrama R4marketing , no qual diariamente compartilho materiais Ășteis sobre o uso da linguagem R na resolução de minhas tarefas diĂĄrias.

Source: https://habr.com/ru/post/pt469215/


All Articles