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

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

In questo articolo vedremo come funziona la gestione delle date nella sintassi di base del linguaggio R, oltre a considerare alcuni pacchetti utili che ne espandono le capacità nella gestione delle date:

  • lubridate — un pacchetto che permette 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 (funzionalità di base, nonché pacchetti lubridate e timeperiodsR)

Contenuto

Se sei interessato all'analisi dei dati, e in particolare al linguaggio R, potresti essere interessato ai miei telegram e youtube canali. Gran parte dei contenuti è dedicata al linguaggio R.

  1. Gestione delle date nella sintassi di base R
    1.1. Conversione di testo in data
    1.2. Estrazione dei componenti della data in R di base
  2. Gestione delle date con il pacchetto lubridate
    2.1. Conversione di testo in data con lubridate
    2.2. Estrazione dei componenti delle date con il pacchetto lubridate
    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 con timeperiodsR
  4. Conclusione

Gestione delle date nella sintassi di base R

Conversione di testo in data

In R di base è presente un insieme di funzioni per lavorare con le date. Il difetto della sintassi di base è che il case dei nomi e degli argomenti delle funzioni è molto disomogeneo e praticamente privo di connessione logica. Tuttavia, è necessario conoscere le funzioni di base del linguaggio, quindi iniziamo proprio da esse.

Più spesso, quando carichi dati in R, da file csv o altre fonti, ottieni la data in formato testo. Per convertire questo testo nel tipo di dato corretto, utilizza 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() che accetta la data in due formati: YYYY-MM-DD o YYYY/MM/DD.
Se nel tuo set di dati le date sono presentate in un formato diverso, puoi utilizzare l'argomento per la conversione format.

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

format accetta in forma di stringa i caratteri che indicano un intervallo di tempo e il suo formato, i valori più comunemente usati 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 a due cifre del mese (01-12)

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

%B
Nome completo del mese

%y
Designazione a due cifre dell'anno

%Y
Designazione a quattro cifre dell'anno

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

%U
Numero della settimana dell'anno (00 — 53), inizio della settimana Domenica

%W
Numero della settimana dell'anno (00 — 53), inizio della settimana Lunedì

Pertanto, "26 settembre 2019" è — il nome completo del mese, il giorno e l'anno. Descrivere questo formato di data con i simboli può essere fatto così:"%B %d, %Y".

Dove:

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

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

Ci sono situazioni in cui ricevi una data non solo che non corrisponde ai formati standard (YYYY-MM-DD o YYYY/MM/DD), ma anche in una lingua che è diversa da quella impostata di default nel tuo sistema operativo. Ad esempio, hai caricato dei dati in cui la data è indicata in questo modo: "15 dicembre 2019". Prima di convertire questa stringa in data, devi cambiare la località.

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

Estrazione dei componenti della data in R di base

In R base non ci sono molte funzioni che permettono di estrarre qualsiasi parte della data da un oggetto di classe Date.

current_date <- Sys.Date() # data attuale
weekdays(current_date)     # ottenere il numero del giorno della settimana
months(current_date)       # ottenere il numero del mese dell'anno
quarters(current_date)     # ottenere il numero del trimestre dell'anno

Oltre alla classe principale degli oggetti Date in R base ci sono anche 2 tipi di dati che memorizzano un timestamp: POSIXlt, POSIXct. La principale differenza di queste classi è che oltre alla data memorizzano anche l'ora. Date Sys.time()

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

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

# "POSIXct" "POSIXt"

La funzione restituisce attualmente la data e l'ora nel formato . Questo formato è concettualmente simile a POSIXctUNIXTIME , e memorizza il numero di secondi dall'inizio dell'era UNIX(mezzanotte (UTC) del 31 dicembre 1969 al 1 gennaio 1970) memorizza anche l'ora e la data, e tutti i loro componenti. Pertanto è un oggetto con una struttura più complessa, ma dal quale è facile ottenere qualsiasi componente della data e dell'ora poiché essenzialmente.

Classe POSIXlt La conversione dei dati numerici e testuali in formati POSIXlt ClusterFirst 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  # часовой пояс

POSIX* è effettuata dalle funzioni as.POSIXct() as.POSIXlt() e . Queste funzioni hanno un insieme limitato di argomenti.x — Numero, stringa o oggetto di classe

  • , che deve essere convertito; Datetz — Fuso orario, di default "GMT";
  • format — Descrizione del formato della data in cui i dati passati come argomento x sono presentati;
  • format — Descrizione del formato della data in cui sono presenti i dati passati all'argomento x;
  • origine — Utilizzato solo per la conversione di un numero in POSIX, in questo argomento è necessario passare un oggetto di data e ora da cui si conta il numero di secondi. Di solito, viene utilizzato per tradurre da UNIXTIME.

Se i tuoi dati sulla data e sull'ora sono presentati in , e memorizza il numero di secondi dall'inizio dell'era UNIX, per convertirli in una data comprensibile e leggibile, utilizza il seguente esempio:

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

In origine puoi specificare qualsiasi timestamp. Ad esempio, se nei tuoi dati la data e l'ora sono indicate come numero di secondi a partire 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")

Gestione delle date con il pacchetto lubridate

lubridate probabilmente il pacchetto più popolare per lavorare con le date nel linguaggio R. Ti fornisce anche altri tre classi.

  • durations — durata, cioè il numero di secondi tra due timestamp;
  • periods — i periodi consentono di eseguire calcoli tra date in intervalli comprensibili per gli esseri umani: giorni, mesi, settimane e così via;
  • intervals — oggetti che forniscono il momento iniziale e finale del tempo.

L'installazione di pacchetti aggiuntivi nel linguaggio R avviene tramite la funzione standard install.packages().

Installazione del pacchetto lubridate:

install.packages("lubridate")

Conversione di testo in data con lubridate

Le funzioni del pacchetto lubridate semplificano notevolmente il processo di conversione del testo in data e ti permettono anche di eseguire operazioni aritmetiche su date e orari.

Per ottenere la data corrente o la data e ora, puoi utilizzare le funzioni today() e now().

today() # data corrente
now()   # data e ora correnti

Per convertire una stringa in data in lubridate c'è tutta una famiglia di funzioni i cui nomi consistono sempre di tre lettere, che indicano la sequenza dei componenti della data:

  • y — anno
  • m — mese
  • d — giorno

Elenco delle funzioni per la conversione del testo in data tramite lubridate

  • 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 puoi vedere lubridate è notevolmente più efficace nel riconoscere la descrizione delle date in forma testuale e ti consente di convertire il testo in data senza utilizzare operatori aggiuntivi per descrivere il formato.

Estrazione dei componenti delle date con il pacchetto lubridate

Inoltre, con lubridate puoi ottenere qualsiasi componente da una data:

dt <- ymd("2017 jan 21")

year(dt)  # anno
month(dt) # mese
mday(dt)  # giorno nel mese
yday(dt)  # giorno dell'anno
wday(dt)  # giorno della settimana

Operazioni aritmetiche con le date

Ma la funzionalità più importante e fondamentale lubridate consiste nella possibilità di eseguire diverse operazioni aritmetiche con le date.

L'arrotondamento della data avviene tramite tre funzioni:

  • floor_date — arrotondamento al tempo passato più prossimo
  • ceiling_date — arrotondamento al tempo futuro più prossimo
  • round_date — arrotondamento al tempo più prossimo

Ognuna di queste funzioni ha un argomento unit, che ti permette di specificare l'unità di arrotondamento: secondi, minuti, ore, giorni, settimane, mesi, bimestri, trimestri, stagioni, semestri, anni

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # arrotonda al mese
round_date(dt, unit = "3 month")  # arrotonda a 3 mesi
round_date(dt, unit = "quarter")  # arrotonda al trimestre
round_date(dt, unit = "season")   # arrotonda alla stagione
round_date(dt, unit = "halfyear") # arrotonda al semestre

Quindi, vediamo come ottenere una data che sarà tra 8 giorni dalla data attuale e fare vari altri calcoli aritmetici tra due date.

today() + days(8)   # quale sarà la data tra 8 giorni
today() - months(2) # quale era la data 2 mesi fa
today() + weeks(12) # quale sarà la data tra 12 settimane
today() - years(2)  # quale era la data 2 anni fa

Lavoro semplificato con le periodi, pacchetto timeperiodsR.

timeperiodsR — un nuovo pacchetto per lavorare con le date che è stato pubblicato su CRAN nel settembre 2019.

Installazione del pacchetto timeperiodsR:

install.packages("timeperiodsR")

Lo scopo principale è la rapida determinazione di un intervallo temporale rispetto a una data data. Ad esempio, con le sue funzioni puoi facilmente:

  • Ottenere la settimana, il mese, il trimestre o l'anno precedente in R.
  • Ottenere un dato numero di intervalli di tempo rispetto a una data, ad esempio 4 settimane precedenti.
  • Facilmente estrarre dai periodi di tempo ottenuti i loro componenti: data di inizio e fine, numero di giorni inclusi nell'intervallo, tutta la sequenza di date che lo compongono.

Il nome di tutte le funzioni del pacchetto timeperiodsR è intuitivo e composto da due parti: direzione_intervallo, dove:

  • direzione nel quale muoversi rispetto alla data fornita: last_n, previous, this, next, next_n.
  • temporale intervallo per calcolare il periodo: giorno, settimana, mese, trimestre, anno.

Set completo di funzioni:

  • 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 hai bisogno di generare report basati su dati dell'ultima settimana o mese. Per ottenere il mese passato, utilizza la funzione omonima previous_month():

prmonth <- previous_month()

Dopo di che avrai un oggetto prmonth classe tpr, da cui è facile ottenere i seguenti componenti:

  • la data di inizio del periodo, nel nostro esempio è il mese scorso
  • la data di fine del periodo
  • il numero di giorni inclusi nel periodo
  • la sequenza di date incluse nel periodo

Inoltre, è possibile ottenere ciascuno dei componenti in vari 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 part, che è presente in ciascuna delle funzioni del pacchetto. Valori possibili: start, end, sequence, length.

previous_month(part = "start")    # inizio periodo
previous_month(part = "end")      # fine periodo
previous_month(part = "sequence") # sequenza di date
previous_month(part = "length")   # numero di giorni nel periodo

Quindi, esaminiamo tutti gli argomenti disponibili nelle funzioni del pacchetto timeperiodsR:

  • x — Data di riferimento da cui sarà calcolato il periodo temporale, di default è la data attuale;
  • n — Numero di intervalli che saranno inclusi nel periodo, ad esempio 3 settimane precedenti;
  • part — Quale componente dell'oggetto tpr devi ottenere, di default all;
  • week_start — L'argomento è presente solo nelle funzioni per lavorare con le settimane e consente di specificare il numero del giorno della settimana che sarà considerato come inizio, di default il lunedì è l'inizio della settimana, ma puoi specificare qualsiasi giorno da 1 — lunedì a 7 — domenica.

In questo modo, puoi calcolare qualsiasi periodo temporale rispetto alla data attuale o a qualsiasi altra data fornita; fornisco ancora alcuni esempi:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Periodo di tempo: dal  9 settembre 2019, lunedì al 29 settembre 2019, domenica

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

Abbiamo bisogno di un periodo che rispetto al 6 ottobre prenderà le 3 settimane precedenti, escluse le settimana che include il 6 ottobre. Di conseguenza, questo è il periodo dal 9 al 29 settembre.

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

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Periodo di tempo: dal  1 maggio 2019, mercoledì al 31 maggio 2019, venerdì

In questo esempio, ci interessa il mese che era 4 mesi fa, se consideriamo il 16 settembre 2019; di conseguenza, era maggio 2019.

Filtraggio di un vettore di date con timeperiodsR

Per filtrare le date in timeperiodsR ci sono diversi operatori:

  • %left_out% — confronta due oggetti della classe tpr e restituisce i valori del sinistro che sono assenti nel destro.
  • %left_in% — confronta due oggetti della classe tpr e restituisce le date dell'oggetto sinistro che sono incluse nel destro.
  • %right_out% — confronta due oggetti della classe tpr e restituisce i valori del destro che sono assenti nel sinistro.
  • %right_in% - confronta due oggetti della classe tpr e restituisce le date dell'oggetto di destra che sono presenti nell'oggetto di sinistra.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # ottenere le date da period1 che sono in period2
period1 %left_out% period2  # ottenere le date da period1 che non sono in period2
period1 %right_in% period2  # ottenere le date da period2 che sono in period1
period1 %right_out% period2 # ottenere le date da period2 che non sono in period1

Il pacchetto timeperiodsR ha un ufficiale, in lingua russa playlist su YouTube.

Conclusione

Abbiamo esaminato in dettaglio le classi di oggetti destinate nel linguaggio R per lavorare con le date. Inoltre, ora sai come eseguire operazioni aritmetiche sulle date e ottenere rapidamente qualsiasi periodo temporale utilizzando il pacchetto timeperiodsR.

Se sei interessato al linguaggio R, ti invito a iscriverti al mio canale Telegram R4marketing, dove quotidianamente condivido materiali utili sull'applicazione del linguaggio R nella risoluzione delle mie attività quotidiane.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster