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 la gestione delle date nella sintassi di base del linguaggio R, oltre a vedere alcuni pacchetti utili che ne ampliavano le capacità nel lavoro con le date:
lubridate— un pacchetto che consente di effettuare calcoli aritmetici tra le date;timeperiodsR— un pacchetto per gestire intervalli di tempo e i loro componenti.

Contenuto
Se sei interessato all'analisi dei dati e, in particolare, al linguaggio R, potresti essere interessato ai miei e canali. Gran parte dei contenuti è dedicata al linguaggio R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Gestione delle date nella sintassi di base di R
Conversione del testo in data
Nella versione base di R è presente un insieme di funzioni per lavorare con le date. Lo svantaggio della sintassi di base è che la maiuscole e minuscole dei nomi e degli argomenti delle funzioni sono molto disparati e praticamente privi di logica. Tuttavia, è necessario conoscere le funzioni di base del linguaggio, quindi iniziamo proprio da esse.
Quando si caricano dati in R, da file csv o altre fonti, si ottiene spesso la data in forma testuale. Per convertire questo testo nel tipo di dati corretto, utilizzate 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"Di default as.Date() che accetta la data in due formati: YYYY-MM-DD o YYYY/MM/DD.
Se nel vostro set di dati le date sono rappresentate in un formato diverso, è possibile utilizzare l'argomento format.
as.Date("September 26, 2019", format = "%B %d, %Y")format che accetta come stringa i simboli 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
Indicazione a due cifre del mese (01-12)
%b
Abbreviazione del nome del mese (apr, mar, ...)
%B
Nome completo del mese
%y
Indicazione dell'anno a due cifre
%Y
Indicazione dell'anno a quattro cifre
%j
Numero del giorno nell'anno (001 — 366)
%U
Numero della settimana nell'anno (00 — 53), inizio della settimana Domenica
%W
Numero della settimana nell'anno (00 — 53), inizio della settimana Lunedì
Pertanto, "26 settembre 2019" è — il nome completo del mese, il giorno e l'anno. È possibile descrivere questo formato di data con gli operatori nel seguente modo:"%B %d, %Y".
Dove:
%B— Nome completo del mese%d— Numero del giorno nel mese%Y— Indicazione dell'anno a quattro cifre
Quando si descrive il formato della data, è importante includere tutti i simboli aggiuntivi dalla vostra stringa, come trattini, virgole, punti, spazi, ecc. Nel mio esempio, "26 settembre 2019", dopo la data c'è una virgola, e nella descrizione del formato è necessario includere anche la virgola:"%B %d, %Y".
Ci sono situazioni in cui ricevi una data che non corrisponde solo ai formati standard (YYYY-MM-DD o YYYY/MM/DD), ma è anche in una lingua diversa da quella impostata come predefinita nel tuo sistema operativo. Ad esempio, hai caricato dati dove la data è indicata in questo modo: "15 dicembre 2019". Prima di convertire questa stringa in una data, è necessario cambiare la locale.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Estrazione dei componenti della data in R di base
Nel R di base non ci sono molte funzionalità che permettano di estrarre una 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'annoOltre alla classe principale degli oggetti Date nel R di base ci sono altri 2 tipi di dati che memorizzano un timestamp: POSIXlt, POSIXct. La principale differenza tra queste classi Date è 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 attuali nel formato POSIXct. Questo formato è concettualmente simile a UNIXTIME, e memorizza il numero di secondi dall'inizio dell'era UNIX (mezzanotte (UTC) del 31 dicembre 1969 al 1 gennaio 1970).
Classe POSIXlt memorizza anche ora e data, e tutti i loro componenti. Pertanto, è un oggetto con una struttura più complessa, ma da cui è facile ottenere qualsiasi componente di data e ora poiché, in sostanza POSIXlt questo 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 # часовой поясLa conversione di dati numerici e testuali in formati POSIX* è effettuata dalle funzioni as.POSIXct() e as.POSIXlt(). Queste funzioni hanno un piccolo insieme di argomenti.
- x — Numero, stringa o oggetto di classe Date, che deve essere convertito;
- tz — Fuso orario, di default "GMT";
- format — Descrizione del formato della data in cui sono presentati i dati trasmessi come argomento x;
- origin — Utilizzato esclusivamente nella conversione di un numero in POSIX, in questo argomento è necessario fornire un oggetto data e ora da cui parte il conteggio dei secondi. Di solito, viene usato per la traduzione da UNIXTIME.
Se i vostri dati sulla data e l'ora sono presentati in UNIXTIME, per convertirli in una data comprensibile e leggibile, utilizzate il seguente esempio:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")In origin potete specificare qualsiasi timestamp. Ad esempio, se nei vostri dati la data e l'ora sono indicate come il numero di secondi a partire dal 15 settembre 2019 ore 12:15, per trasformarli in una data utilizzate:
# Конвертируем 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. Vi fornisce inoltre altri tre classi.
- durations — durata, cioè il numero di secondi tra due timestamp;
- periods — i periodi consentono di effettuare calcoli tra date in intervalli comprensibili per l'uomo: giorni, mesi, settimane e così via;
- intervals — oggetti che forniscono il momento di inizio e fine del tempo.
L'installazione di pacchetti aggiuntivi nel linguaggio R avviene con la funzione standard install.packages().
Installazione del pacchetto lubridate:
install.packages("lubridate")Conversione del testo in data con lubridate
Funzioni del pacchetto lubridate semplificano notevolmente il processo di conversione del testo in data e consentono di eseguire operazioni aritmetiche su date e orari.
Per ottenere la data corrente, o data e ora, puoi utilizzare le funzioni today() e now().
today() # data corrente
now() # data e ora correntiPer convertire una stringa in data in lubridate c'è un'intera famiglia di funzioni i cui nomi consistono sempre di tre lettere e indicano la sequenza dei componenti della data:
- y — anno
- m — mese
- d — giorno
Elenco delle funzioni per convertire il testo in data tramite lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Alcuni esempi per convertire stringhe in date:
ymd("21 gen 2017")
mdy("20 marzo 2019")
dmy("1 aprile 2018")Come puoi vedere, lubridate è notevolmente più efficace nel riconoscere le descrizioni delle date scritte in forma testuale, e ti permette 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 dalla data:
dt <- ymd("21 gen 2017")
anno(dt) # anno
mese(dt) # mese
giorno(dt) # giorno del mese
giorno dell'anno(dt) # giorno dell'anno
giorno della settimana(dt) # giorno della settimanaOperazioni aritmetiche con le date
Ma, la funzionalità più importante e principale lubridate consiste nella possibilità di eseguire diverse operazioni aritmetiche con le date.
L'arrotondamento della data è effettuato da tre funzioni:
floor_date— arrotondamento al tempo passato più vicinoceiling_date— arrotondamento al tempo futuro più vicinoround_date— arrotondamento al tempo più vicino
Ognuna di queste funzioni ha un argomento un'unità, che ti consente 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") # arrotondare al mese
round_date(dt, unit = "3 month") # arrotondare a 3 mesi
round_date(dt, unit = "quarter") # arrotondare al trimestre
round_date(dt, unit = "season") # arrotondare alla stagione
round_date(dt, unit = "halfyear") # arrotondare al semestreQuindi, vediamo come ottenere una data che sarà tra 8 giorni dalla data attuale e effettuare diversi altri calcoli aritmetici tra due date.
today() + days(8) # quale data sarà tra 8 giorni
today() - months(2) # quale data era 2 mesi fa
today() + weeks(12) # quale data sarà tra 12 settimane
today() - years(2) # quale data era 2 anni faLavorare con i periodi semplificati, il pacchetto timeperiodsR.
timeperiodsR — un pacchetto recente per la gestione delle date pubblicato su CRAN nel settembre 2019.
Installazione del pacchetto timeperiodsR:
install.packages("timeperiodsR")Lo scopo principale è identificare rapidamente un intervallo di tempo rispetto a una data specificata. Ad esempio, con le sue funzioni, puoi facilmente:
- Ottenere la settimana, il mese, il trimestre o l'anno scorso in R.
- Ottenere un numero specificato di intervalli di tempo rispetto a una data, ad esempio le ultime 4 settimane.
- Estrarre facilmente i componenti dell'intervallo di tempo ottenuto: la data iniziale e finale, il numero di giorni inclusi nell'intervallo, tutta la sequenza di date che vi appartiene.
I nomi di tutte le funzioni del pacchetto timeperiodsR sono intuitivi e consistono in due parti: direzione_intervallo, dove:
- direzione in cui muoversi rispetto alla data specificata: last_n, previous, this, next, next_n.
- temporale intervallo per calcolare il periodo: day, week, month, quarter, year.
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 quando è necessario generare rapporti basati sui dati della settimana o del mese scorso. Per ottenere il mese scorso, utilizza la funzione omonima. previous_month():
prmonth <- previous_month()Dopo di che, avrai un oggetto prmonth classe tpr, da cui puoi facilmente 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 inclusa nel periodo
Inoltre, puoi ottenere ciascuno dei componenti in modi diversi:
# первый день периода
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, presente in ognuna 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 periodoQuindi, esaminiamo tutti gli argomenti disponibili nelle funzioni del pacchetto timeperiodsR:
x— Data di riferimento dalla quale verrà calcolato il periodo, di default la data attuale;n— Numero di intervalli che entreranno nel periodo, ad esempio 3 settimane precedenti;part— Quale componente dell'oggettotprè necessario ottenere, per impostazione predefinitaall;settimana_inizio— Questo argomento è presente solo nelle funzioni per lavorare con le settimane e consente di impostare il numero del giorno della settimana che sarà considerato l'inizio, per default l'inizio della settimana è lunedì, ma è possibile impostare qualsiasi giorno da 1 — lunedì a 7 — domenica.
In questo modo, puoi calcolare qualsiasi periodo di tempo rispetto alla data attuale o a qualsiasi altra data specificata. Ecco altri 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, domenica6 ottobre è una domenica:

Abbiamo bisogno di un periodo che prenda 3 settimane precedenti rispetto al 6 ottobre, escludendo la settimana che include il 6 ottobre stesso. Quindi, si tratta del periodo dal 9 al 29 settembre.

# получить месяц отстающий на 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, partendo dal 16 settembre 2019, quindi era maggio 2019.
Filtraggio di un vettore di date utilizzando timeperiodsR
Per filtrare le date in timeperiodsR ci sono diversi operatori:
- %left_out% — confronta due oggetti di classe tpr e restituisce il valore del sinistro che è assente nel destro.
- %left_in% — confronta due oggetti di classe tpr e restituisce le date dall'oggetto di sinistra che rientrano in quello di destra.
- %right_out% — confronta due oggetti di classe tpr e restituisce i valori dall'oggetto di destra che non sono presenti in quello di sinistra.
- %right_in% — confronta due oggetti di classe tpr e restituisce le date dall'oggetto di destra che sono presenti in quello di sinistra.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # ottenere date da period1 che rientrano in period2
period1 %left_out% period2 # ottenere date da period1 che non rientrano in period2
period1 %right_in% period2 # ottenere date da period2 che rientrano in period1
period1 %right_out% period2 # ottenere date da period2 che non rientrano in period1Il pacchetto timeperiodsR ha una guida ufficiale in russo .
Conclusione
Abbiamo esaminato in dettaglio le classi di oggetti utilizzate nel linguaggio R per lavorare con le date. Ora sei anche in grado di eseguire operazioni aritmetiche sulle date e ottenere rapidamente qualsiasi intervallo temporale con l'aiuto del pacchetto timeperiodsR.
Se sei interessato al linguaggio R, ti invito a iscriverti al mio canale Telegram , dove ogni giorno condivido materiali utili sull'applicazione del linguaggio R nella risoluzione delle mie attività quotidiane.
Fonte: habr.com
