Lavorare con le date nel linguaggio R (caratteristiche di base, nonché i pacchetti lubridate e timeperiodsR)

Ottieni la data corrente in qualsiasi linguaggio di programmazione, un'operazione equivalente a "Hello world!" Il linguaggio R non fa eccezione.

In questo articolo, esamineremo come funziona l'utilizzo delle date nella sintassi di base del linguaggio R e vedremo anche diversi pacchetti utili che espandono le sue capacità quando si lavora con le date:

  • lubridate — un pacchetto che consente di eseguire calcoli aritmetici tra date;
  • timeperiodsR — un pacchetto per lavorare con intervalli di tempo e i loro componenti.

Lavorare con le date nel linguaggio R (caratteristiche di base, nonché i pacchetti lubridate e timeperiodsR)

contenuto

Se sei interessato all'analisi dei dati, e in particolare al linguaggio R, potrebbe interessarti il ​​mio Telegram и youtube canali. La maggior parte del contenuto è dedicata al linguaggio R.

  1. Lavorare con le date nella sintassi R di base
    1.1 Converti il ​​testo fino ad oggi
    1.2 Estrazione dei componenti della data in R di base
  2. Lavorare con le date utilizzando il pacchetto lubrificante
    2.1 Converti il ​​testo fino ad oggi utilizzando lubrificate
    2.2 Estrazione dei componenti della data utilizzando il pacchetto di lubrificanti
    2.3 Operazioni aritmetiche con le date
  3. Lavoro semplificato con periodi, pacchetto timeperiodsR
    3.1 Intervalli di tempo in timeperiodsR
    3.2 Filtraggio di un vettore di date utilizzando timeperiodsR
  4. conclusione

Lavorare con le date nella sintassi R di base

Converti il ​​testo fino ad oggi

Basic R dispone di una serie di funzioni per lavorare con le date. Lo svantaggio della sintassi di base è che i casi dei nomi delle funzioni e degli argomenti sono molto dispersi e non hanno praticamente alcuna connessione logica. Tuttavia, è necessario conoscere le funzioni di base della lingua, quindi inizieremo con esse.

Molto spesso quando si caricano dati in R, da file CSV o altre origini, si riceve una data come testo. Per convertire questo testo nel tipo di dati corretto, utilizzare la funzione 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 impostazione predefinita as.Date() accetta la data in due formati: AAAA-MM-GG o AAAA/MM/GG.
Se il tuo set di dati contiene date in un altro formato, puoi utilizzare l'argomento format.

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

formato accetta operatori sotto forma di stringa che denotano l'eventuale intervallo temporale e il suo formato; i valori più comunemente utilizzati sono riportati nella tabella seguente:

Formato
descrizione

%d
Numero del giorno nel mese

%a
Abbreviazione del nome del giorno della settimana

%A
Nome completo del giorno della settimana

%w
Numero del giorno della settimana (0-6, dove 0 è domenica)

%m
Designazione del mese a due cifre (01-12)

%b
Abbreviazione del nome del mese (apr, mar, …)

%B
Nome del mese completo

%y
Designazione dell'anno a due cifre

%Y
Designazione dell'anno a quattro cifre

%j
Numero del giorno nell'anno (001 - 366)

%U
Numero della settimana nell'anno (00 - 53), inizio settimana domenica

%W
Numero della settimana nell'anno (00 - 53), inizio della settimana lunedì

Di conseguenza, “26 settembre 2019” è il nome completo del mese, della data e dell’anno. Questo formato di data può essere descritto utilizzando gli operatori come segue:"%B %d, %Y".

Dove:

  • %B — Nome completo del mese
  • %d — Numero del giorno del mese
  • %Y — Designazione dell'anno a quattro cifre

Quando si descrive il formato della data, è importante includere tutti i caratteri aggiuntivi della stringa, come trattini, virgole, punti, spazi e così via. Nel mio esempio, "26 settembre 2019", c'è una virgola dopo la data e devi anche inserire una virgola nella descrizione del formato:"%B %d, %Y".

Ci sono situazioni in cui ricevi una data che non solo non corrisponde ai formati standard (AAAA-MM-GG o AAAA/MM/GG), ma anche in una lingua diversa da quella predefinita installata sul tuo sistema operativo. Ad esempio, hai scaricato dati in cui la data è indicata in questo modo: "15 dicembre 2019". Prima di convertire questa stringa in una data, è necessario modificare la locale.

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

Estrazione dei componenti della data in R di base

Non ci sono molte funzioni in R di base che ti consentono di estrarre qualsiasi parte di una data da un oggetto di classe Data.

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

Oltre alla classe oggetto principale Data in R di base ci sono altri 2 tipi di dati che memorizzano un timestamp: POSIXLt, POSIXct. La differenza principale tra queste classi e Data è che oltre alla data memorizzano anche l'ora.

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

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

# "POSIXct" "POSIXt"

Funzione Sys.time() restituisce la data e l'ora correnti nel formato POSIXct. Questo formato è simile nel significato a UNIXTIMEe memorizza il numero di secondi dall'inizio dell'era UNIX (mezzanotte (UTC) dal 31 dicembre 1969 al 1 gennaio 1970).

classe POSIXLt memorizza anche l'ora e la data e tutti i loro componenti. Si tratta quindi di un oggetto dalla struttura più complessa, ma dal quale è facile ricavare qualsiasi componente di data e ora perché Infatti POSIXLt essa stratagemma.

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

Conversione di dati numerici e di testo in formati POSIX* svolto dalle funzioni as.POSIXct() и as.POSIXlt(). Queste funzioni hanno un piccolo insieme di argomenti.

  • x — Numero, stringa o oggetto classe Data, che necessita di essere convertito;
  • tz — Fuso orario, predefinito "GMT";
  • format — Descrizione del formato della data in cui sono rappresentati i dati passati all'argomento x;
  • origin — Utilizzato solo quando si converte un numero in POSIX; è necessario passare in questo argomento un oggetto data e un'ora da cui vengono contati i secondi. Tipicamente utilizzato per la traduzione da UNIXTIME.

Se le informazioni su data e ora sono presenti UNIXTIME, quindi per convertirli in una data chiara e leggibile, utilizzare il seguente esempio:

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

In origine è possibile specificare qualsiasi timestamp. Ad esempio, se i tuoi dati contengono la data e l'ora come numero di secondi dal 15 settembre 2019 alle 12:15, per convertirli in una data utilizza:

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

Lavorare con le date utilizzando il pacchetto lubrificante

lubridate Forse il pacchetto più popolare per lavorare con le date nel linguaggio R. Fornisce tre classi aggiuntive.

  • durate - durata, cioè numero di secondi tra due timestamp;
  • periodi: i periodi consentono di effettuare calcoli tra date in intervalli leggibili dall'uomo: giorni, mesi, settimane e così via;
  • intervalli: oggetti che forniscono il punto iniziale e finale nel tempo.

L'installazione di pacchetti aggiuntivi nel linguaggio R viene eseguita utilizzando la funzione standard install.packages().

Installazione del pacchetto lubridate:

install.packages("lubridate")

Converti il ​​testo fino ad oggi utilizzando lubrificate

Caratteristiche del pacchetto lubridate semplifica notevolmente il processo di conversione del testo in una data e consente anche di eseguire qualsiasi operazione aritmetica con date e ore.

Le funzioni ti aiuteranno a ottenere la data corrente o la data e l'ora today() и now().

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

Per convertire una stringa in una data in lubridate Esiste un'intera famiglia di funzioni i cui nomi sono sempre formati da tre lettere e indicano la sequenza dei componenti della data:

  • y - anno
  • m - mese
  • d - giorno

Elenco delle funzioni per convertire il testo fino ad oggi tramite lubrificare

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

Alcuni esempi per convertire stringhe in date:

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

Come potete vedere lubridate È molto più efficiente nel riconoscere le descrizioni delle date come testo e consente di convertire il testo nella data senza utilizzare operatori aggiuntivi per descrivere il formato.

Estrazione dei componenti della data utilizzando il pacchetto di lubrificanti

Anche utilizzando lubridate puoi ottenere qualsiasi componente a partire da una data:

dt <- ymd("2017 jan 21")

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

Operazioni aritmetiche con le date

Ma la funzionalità più importante e basilare lubridate è la capacità di eseguire varie operazioni aritmetiche con le date.

L'arrotondamento della data viene eseguito da tre funzioni:

  • floor_date - arrotondando al passato più vicino
  • ceiling_date - arrotondamento al futuro prossimo
  • round_date - arrotondamento all'ora più vicina

Ognuna di queste funzioni ha un argomento unitàche consente di specificare l'unità di arrotondamento: secondo, minuto, ora, giorno, settimana, mese, bimestre, trimestre, stagione, semestre, anno

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

Quindi cerchiamo di capire come ottenere una data che sia 8 giorni dopo la data corrente ed eseguiamo vari altri calcoli aritmetici tra le due date.

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

Lavoro semplificato con periodi, pacchetto timeperiodsR.

timeperiodsR — un nuovo pacchetto per lavorare con le date pubblicato su CRAN a settembre 2019.

Installazione del pacchetto timeperiodsR:

install.packages("timeperiodsR")

Lo scopo principale è determinare rapidamente un certo intervallo di tempo rispetto a una determinata data. Ad esempio, utilizzando le sue funzioni potrai facilmente:

  • Ottieni l'ultima settimana, mese, trimestre o anno in R.
  • Ottieni un numero specifico di intervalli di tempo relativi a una data, ad esempio le ultime 4 settimane.
  • È facile estrarre i suoi componenti dall'intervallo di tempo risultante: la data di inizio e di fine, il numero di giorni inclusi nell'intervallo, l'intera sequenza di date in esso incluse.

Nome di tutte le funzioni del pacchetto timeperiodsR sono intuitivi e si compongono di due parti: direzione_интервал, dove:

  • direzione in cui devi spostarti rispetto ad una determinata data: last_n, previous, this, next, next_n.
  • temporaneo интервал per calcolare il periodo: giorno, settimana, mese, trimestre, anno.

Set completo di funzionalità:

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

Intervalli di tempo in timeperiodsR

Queste funzioni sono utili nei casi in cui è necessario creare report basati sui dati della settimana o del mese precedente. Per ottenere l'ultimo mese, utilizzare la funzione con lo stesso nome previous_month():

prmonth <- previous_month()

Dopodiché avrai un oggetto mese classe tpr, da cui si possono facilmente ottenere i seguenti componenti:

  • la data di inizio del periodo, nel nostro esempio è l'ultimo mese
  • data di fine periodo
  • numero di giorni compresi nel periodo
  • sequenza di date comprese nel periodo

Inoltre, è possibile ottenere ciascuno dei componenti in diversi modi:

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

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

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

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

Puoi anche ottenere uno qualsiasi dei componenti utilizzando l'argomento parte, che è presente in ciascuna delle funzioni del pacchetto. Valori possibili: inizio, fine, sequenza, durata.

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

Diamo quindi un'occhiata a tutti gli argomenti disponibili nelle funzioni del pacchetto timeperiodsR:

  • x — La data di riferimento da cui verrà calcolato il periodo di tempo, la data corrente per impostazione predefinita;
  • n — Il numero di intervalli che saranno inclusi nel periodo, ad esempio le 3 settimane precedenti;
  • part — Quale componente dell'oggetto tpr devi ottenere, per impostazione predefinita all;
  • week_start — L'argomento è presente solo nelle funzioni per lavorare con le settimane e consente di impostare il numero del giorno della settimana che verrà considerato il suo inizio. Per impostazione predefinita, l'inizio della settimana è lunedì, ma è possibile impostarne uno qualsiasi da 1 - Lunedì alle 7 - Domenica.

Pertanto, puoi calcolare qualsiasi periodo di tempo relativo alla data corrente o a qualsiasi altra data; ecco alcuni altri esempi:

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

Il 6 ottobre è domenica:
Lavorare con le date nel linguaggio R (caratteristiche di base, nonché i pacchetti lubridate e timeperiodsR)

Occorre un periodo che, relativo al 6 ottobre, occuperà le 3 settimane precedenti. Esclusa la settimana che comprende il 6 ottobre stesso. Di conseguenza, questo è il periodo dal 9 settembre al 29 settembre.

Lavorare con le date nel linguaggio R (caratteristiche di base, nonché i pacchetti lubridate e 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

In questo esempio, siamo interessati al mese di 4 mesi fa, se iniziamo dal 16 settembre 2019, allora era maggio 2019.

Filtraggio di un vettore di date utilizzando timeperiodsR

Per filtrare le date timeperiodsR Esistono diversi operatori:

  • %left_out%: confronta due oggetti della classe tpr e restituisce il valore di quello di sinistra che manca in quello di destra.
  • %left_in% - confronta due oggetti della classe tpr e restituisce le date dell'oggetto sinistro incluse in quello destro.
  • %right_out% - confronta due oggetti della classe tpr e restituisce il valore di quello di destra che manca da quello di sinistra.
  • %right_in% - confronta due oggetti della classe tpr e restituisce le date dell'oggetto destro che sono presenti in quello sinistro.

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 pacco timeperiodsR ce n'è uno ufficiale, in lingua russa playlist di YouTube.

conclusione

Abbiamo esaminato in dettaglio le classi di oggetti progettati nel linguaggio R per lavorare con le date. Inoltre ora puoi eseguire operazioni aritmetiche sulle date e ottenere rapidamente qualsiasi periodo di tempo utilizzando il pacchetto timeperiodsR.

Se sei interessato al linguaggio R ti invito ad iscriverti al mio canale Telegram R4marketing, in cui condivido quotidianamente materiali utili sull'utilizzo del linguaggio R per risolvere i tuoi problemi quotidiani.

Fonte: habr.com

Aggiungi un commento