ProHoster > Bloc > Administració > Treballar amb dates en R (capacitats bàsiques, així com els paquets lubridate i timeperiodsR)
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.
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.
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:
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.
# получить месяц отстающий на 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
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.