Treballar amb dates en R (capacitats bàsiques, així com els paquets lubridate i timeperiodsR)

Obteniu la data actual en qualsevol llenguatge de programació, una operació equivalent a "Hola món!" El llenguatge R no és una excepció.

En aquest article, veurem com funciona treballar amb dates en la sintaxi bàsica del llenguatge R i també veurem diversos paquets útils que amplien les seves capacitats quan es treballa amb dates:

  • lubridate — un paquet que us permet fer càlculs aritmètics entre dates;
  • timeperiodsR — un paquet per treballar amb intervals de temps i els seus components.

Treballar amb dates en R (capacitats bàsiques, així com els paquets lubridate i timeperiodsR)

Contingut

Si esteu interessats en l'anàlisi de dades, i en particular en el llenguatge R, potser us interessa el meu telegram и youtube canals. La major part del contingut està dedicat al llenguatge R.

  1. Treballar amb dates en la sintaxi R bàsica
    1.1. Converteix text a data
    1.2. Extracció de components de data en R bàsic
  2. Treballant amb dates utilitzant el paquet de lubridat
    2.1. Converteix text a data amb lubridat
    2.2. Extracció de components de la data utilitzant el paquet de lubridat
    2.3. Operacions aritmètiques amb dates
  3. Treball simplificat amb períodes, paquet timeperiodsR
    3.1. Intervals de temps en períodes de tempsR
    3.2. Filtrar un vector de dates utilitzant períodes de tempsR
  4. Conclusió

Treballar amb dates en la sintaxi R bàsica

Converteix text a data

Basic R té un conjunt de funcions per treballar amb dates. El desavantatge de la sintaxi bàsica és que el cas dels noms de funcions i arguments està molt dispers i pràcticament no té connexió lògica. Tanmateix, cal conèixer les funcions bàsiques de la llengua, així que començarem per elles.

Molt sovint, quan carregueu dades a R, des de fitxers csv o d'altres fonts, rebeu una data com a text. Per convertir aquest text al tipus de dades correcte, utilitzeu la funció 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"

Per defecte as.Date() accepta data en dos formats: AAAA-MM-DD o AAAA/MM/DD.
Si el vostre conjunt de dades conté dates en un altre format, podeu utilitzar l'argument format.

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

format accepta operadors en forma de cadena que denoten qualsevol interval de temps i el seu format; els valors més utilitzats es mostren a la taula següent:

Format
Descripció

%d
Número de dia en mes

%a
Abreviatura del nom del dia de la setmana

%A
Nom complet del dia de la setmana

%w
Número del dia de la setmana (0-6, on 0 és diumenge)

%m
Designació del mes de dos dígits (01-12)

%b
Abreviatura del nom del mes (abril, març, ...)

%B
Nom complet del mes

%y
Designació d'any de dos dígits

%Y
Designació d'any de quatre dígits

%j
Número de dia de l'any (001 - 366)

%U
Número de la setmana de l'any (00 - 53), inici de setmana diumenge

%W
Número de setmana de l'any (00 - 53), inici de setmana dilluns

En conseqüència, "26 de setembre de 2019" és el nom complet del mes, la data i l'any. Aquest format de data es pot descriure mitjançant els operadors de la següent manera:"%B %d, %Y".

On:

  • %B — Nom complet del mes
  • %d — Número del dia del mes
  • %Y — Designació d'any de quatre dígits

Quan es descriu el format de la data, és important incloure tots els caràcters addicionals de la cadena, com ara guions, comes, punts, espais, etc. En el meu exemple, "26 de setembre de 2019", hi ha una coma després de la data, i també heu de posar una coma a la descripció del format:"%B %d, %Y".

Hi ha situacions en què rebeu una data que no només no es correspon amb els formats estàndard (AAAA-MM-DD o AAAA/MM/DD), però també en un idioma diferent de l'instal·lat per defecte al vostre sistema operatiu. Per exemple, heu baixat dades on la data s'indica així: "15 de desembre de 2019". Abans de convertir aquesta cadena en una data, heu de canviar la configuració regional.

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

Extracció de components de data en R bàsic

No hi ha moltes funcions en R bàsic que us permetin extreure qualsevol part d'una data d'un objecte de classe Data.

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

A més de la classe d'objecte principal Data a la R bàsica hi ha 2 tipus de dades més que emmagatzemen una marca de temps: POSIXlt, POSIXct. La principal diferència entre aquestes classes i Data és que a més de la data emmagatzemen l'hora.

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

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

# "POSIXct" "POSIXt"

Funció Sys.time() retorna la data i l'hora actuals en el format POSIXct. Aquest format té un significat similar a UNIXTIME, i emmagatzema el nombre de segons des del començament de l'era UNIX (mitjanit (UTC) del 31 de desembre de 1969 a l'1 de gener de 1970).

Classe POSIXlt també emmagatzema l'hora i la data, i tots els seus components. Per tant, és un objecte amb una estructura més complexa, però del qual és fàcil obtenir qualsevol component de data i hora perquè de fet POSIXlt aquest llista.

# Получаем текущую дату и время
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  # часовой пояс

Conversió de dades numèriques i de text a formats POSIX* realitzat per funcions as.POSIXct() и as.POSIXlt(). Aquestes funcions tenen un petit conjunt d'arguments.

  • x — Objecte número, cadena o classe Data, que cal convertir;
  • tz — Zona horària, per defecte "GMT";
  • format — Descripció del format de data en què es representen les dades passades a l'argument x;
  • origin — S'utilitza només quan es converteix un nombre a POSIX; heu de passar un objecte de data i hora a partir dels quals es compten els segons a aquest argument. S'utilitza normalment per a la traducció des d'UNIXTIME.

Si la vostra informació de data i hora es troba a UNIXTIME, i per convertir-los en una data clara i llegible, utilitzeu l'exemple següent:

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

A l'origen podeu especificar qualsevol marca de temps. Per exemple, si les vostres dades contenen la data i l'hora com a nombre de segons des del 15 de setembre de 2019 a les 12:15, per convertir-les en una data, utilitzeu:

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

Treballant amb dates utilitzant el paquet de lubridat

lubridate Potser el paquet més popular per treballar amb dates en llenguatge R. Us ofereix tres classes addicionals.

  • durades — durada, és a dir. nombre de segons entre dues marques de temps;
  • períodes: els períodes permeten fer càlculs entre dates en intervals llegibles per l'home: dies, mesos, setmanes, etc.
  • intervals: objectes que proporcionen el punt inicial i final en el temps.

La instal·lació de paquets addicionals en llenguatge R es realitza mitjançant la funció estàndard install.packages().

Instal·lació del paquet lubridate:

install.packages("lubridate")

Converteix text a data amb lubridat

Característiques del paquet lubridate simplificar significativament el procés de conversió de text en una data i també us permetrà realitzar qualsevol operació aritmètica amb dates i hores.

Les funcions us ajudaran a obtenir la data o la data i l'hora actuals today() и now().

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

Per convertir una cadena en una data en lubridate Hi ha tota una família de funcions els noms de les quals sempre consten de tres lletres, i indiquen la seqüència de components de data:

  • y - any
  • m - mes
  • d - dia

Llista de funcions per convertir text a data mitjançant lubridate

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

Alguns exemples per convertir cadenes a dates:

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

Com veieu lubridate És molt més eficient a l'hora de reconèixer les descripcions de dates com a text i us permet convertir text a data sense utilitzar operadors addicionals per descriure el format.

Extracció de components de la data utilitzant el paquet de lubridat

També utilitzant lubridate podeu obtenir qualsevol component d'una data:

dt <- ymd("2017 jan 21")

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

Operacions aritmètiques amb dates

Però la funcionalitat més important i bàsica lubridate és la capacitat de realitzar diverses operacions aritmètiques amb dates.

L'arrodoniment de la data es realitza mitjançant tres funcions:

  • floor_date — arrodoniment al passat més proper
  • ceiling_date — arrodoniment al temps futur proper
  • round_date - arrodoniment a l'hora més propera

Cadascuna d'aquestes funcions té un argument unitatque permet especificar la unitat d'arrodoniment: segon, minut, hora, dia, setmana, mes, bimes, trimestre, temporada, mig any, any

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

Així que anem a esbrinar com obtenir una data que sigui 8 dies després de la data actual i fer altres càlculs aritmètics entre les dues dates.

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

Treball simplificat amb períodes, paquet timeperiodsR.

timeperiodsR — un paquet nou per treballar amb dates que es va publicar a CRAN el setembre de 2019.

Instal·lació del paquet timeperiodsR:

install.packages("timeperiodsR")

L'objectiu principal és determinar ràpidament un interval de temps determinat en relació a una data determinada. Per exemple, utilitzant les seves funcions podeu:

  • Obteniu la darrera setmana, mes, trimestre o any a R.
  • Obteniu un nombre determinat d'intervals de temps relatius a una data, per exemple, les 4 darreres setmanes.
  • És fàcil extreure els seus components de l'interval de temps resultant: la data d'inici i finalització, el nombre de dies inclosos en l'interval, tota la seqüència de dates que s'hi inclouen.

Nom de totes les funcions del paquet timeperiodsR són intuïtius i consten de dues parts: direcció_intervalon:

  • direcció en què cal moure's en relació a una data determinada: last_n, previous, this, next, next_n.
  • temporal interval per calcular el període: dia, setmana, mes, trimestre, any.

Conjunt complet de funcions:

  • 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()

Intervals de temps en períodes de tempsR

Aquestes funcions són útils en els casos en què necessiteu crear informes basats en dades de la setmana o el mes passat. Per obtenir l'últim mes, utilitzeu la funció del mateix nom previous_month():

prmonth <- previous_month()

Després del qual tindreu un objecte primer mes classe tpr, del qual es poden obtenir fàcilment els components següents:

  • la data d'inici del període, en el nostre exemple aquest és l'últim mes
  • data de finalització del període
  • nombre de dies inclosos en el període
  • seqüència de dates incloses en el període

A més, podeu obtenir cadascun dels components de diferents maneres:

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

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

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

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

També podeu obtenir qualsevol dels components mitjançant l'argument part, que està present en cadascuna de les funcions del paquet. Valors possibles: inici, final, seqüència, longitud.

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

Per tant, mirem tots els arguments disponibles a les funcions del paquet timeperiodsR:

  • x — La data de referència a partir de la qual es calcularà el període de temps, la data actual per defecte;
  • n — El nombre d'intervals que s'inclouran en el període, per exemple les 3 setmanes anteriors;
  • part — Quin component de l'objecte tpr cal obtenir, per defecte all;
  • week_start — L'argument només està present a les funcions per treballar amb setmanes i us permet establir el número del dia de la setmana que es considerarà el seu inici. Per defecte, l'inici de la setmana és dilluns, però podeu definir qualsevol entre 1 - Dilluns a 7 - Diumenge.

Així, podeu calcular qualsevol període de temps relatiu a la data actual o a qualsevol altra data; aquí teniu alguns exemples més:

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

El 6 d'octubre és diumenge:
Treballar amb dates en R (capacitats bàsiques, així com els paquets lubridate i timeperiodsR)

Necessitem un període que, en relació al 6 d'octubre, trigarà les 3 setmanes anteriors. Sense incloure la setmana que inclou el mateix 6 d'octubre. En conseqüència, aquest és el període del 9 al 29 de setembre.

Treballar amb dates en R (capacitats bàsiques, així com els paquets lubridate i 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

En aquest exemple, ens interessa el mes que va ser fa 4 mesos, si comencem a partir del 16 de setembre de 2019, llavors va ser el maig de 2019.

Filtrar un vector de dates utilitzant períodes de tempsR

Per filtrar les dates timeperiodsR Hi ha diversos operadors:

  • %left_out% - compara dos objectes de classe tpr i retorna el valor de l'esquerra que falta al dret.
  • %left_in% - compara dos objectes de la classe tpr i retorna les dates de l'objecte esquerre que s'inclouen a la dreta.
  • %right_out% - compara dos objectes de classe tpr i retorna el valor de la dreta que falta a l'esquerra.
  • %right_in% - compara dos objectes de la classe tpr i retorna les dates de l'objecte dret que hi ha a l'esquerra.

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

Al paquet timeperiodsR n'hi ha un d'oficial en llengua russa Llista de reproducció de YouTube.

Conclusió

Hem examinat amb detall les classes d'objectes dissenyats en el llenguatge R per treballar amb dates. També ara podeu realitzar operacions aritmètiques sobre dates i obtenir ràpidament qualsevol període de temps utilitzant el paquet timeperiodsR.

Si estàs interessat en l'idioma R, et convido a subscriure't al meu canal de telegram R4 màrqueting, en què comparteixo materials útils diàriament sobre l'ús del llenguatge R per resoldre els vostres problemes quotidians.

Font: www.habr.com

Afegeix comentari