Codifica efficace con date e orari in Python

Efficient encoding with dates and times in Python

Utilizzare datetime, zoneinfo, dateutil e pandas

Foto di Jordan Benton da Pexels

Sto lavorando intensivamente con dati di serie temporali ultimamente e ho gestito gli oggetti di data e ora in Python. Per questo, ho imparato alcuni trucchi utili per lavorare con gli oggetti datetime in Python che hanno eliminato la complessità dal mio codice. In questo articolo, vorrei condividere e riassumere i consigli e i trucchi più preziosi che ho imparato.

Per dimostrazione, utilizzerò due set di dati Kaggle, che linkerò quando li utilizzerò. Se vuoi seguirmi, puoi importare le seguenti librerie.

Datetime, zoneinfo, dateutil e pytz

I pacchetti comunemente utilizzati che trattano date e orari in Python sono datetime, dateutil, pytz e il recente zoneinfo. Datetime è il modulo integrato per lavorare con tempi e date in Python e ti consente di fare la maggior parte delle operazioni di base. Dateutil e pytz sono moduli di terze parti e potenti estensioni di datetime quando si affrontano manipolazioni più complesse come delta di tempo relativo, fusi orari e analisi di stringhe.

Tuttavia, dalla versione 3.9 di Python, zoneinfo è incorporato nella libreria standard di Python e, pertanto, viene considerato “più comodo” per il supporto del fuso orario rispetto ad altri moduli di terze parti come dateutil o pytz.

Quindi, a seconda della versione di Python con cui stai lavorando, i moduli integrati di Python potrebbero essere già sufficienti e non sono necessari moduli di terze parti (dateutil e pytz) quando si tratta di fusi orari diversi!

Nel resto dell’articolo, mi concentrerò principalmente sulla gestione di date e orari con datetime, ma menzionerò anche eventuali opzioni per zoneinfo o dateutil. L’articolo si concentrerà prima sugli oggetti datetime singoli, seguiti dalla gestione di date in array e frame di dati utilizzando numpy e pandas:

  1. Creazione di una data o un datetime da zero
  2. Conversione e analisi di stringhe: strftime(), strptime() e dateutil
  3. Date e orari in numpy — datetime64 di numpy
  4. Date e orari in pandas
  5. Creazione di funzionalità da date e orari

1. Creazione di una data o un datetime da zero

Il pacchetto datetime ti consente di creare facilmente oggetti di data e datetime da zero che possono essere utilizzati, ad esempio, come soglie per il filtraggio (prova a stampare gli oggetti creati di seguito e i loro tipi per capire meglio il loro formato).

Inoltre, datetime ti permette di creare oggetti di data e ora che si riferiscono a oggi o adesso.

Stai attento qui, poiché gli oggetti datetime sono di solito “senza fuso orario” e non si riferiscono a un fuso orario specifico, il che potrebbe metterti nei guai quando lavori con colleghi internazionali!

Con l’aiuto del modulo zoneinfo (integrato dalla versione 3.9 di Python), puoi impostare il fuso orario con il parametro tz di astimezone().

2. Conversione e analisi di stringhe: strftime(), strptime() e dateutil

Potresti trovarti in una situazione in cui desideri visualizzare il tuo oggetto datetime come una stringa o convertire una stringa in un oggetto datetime. In questo caso, le funzioni strftime() e strptime() sono utili.

Conversione di un oggetto datetime (o parti di esso) in una stringa

I codici di formato comunemente utilizzati per descrivere gli oggetti datetime possono essere trovati qui.

Conversione di una stringa in un oggetto datetime

Analisi di stringhe complesse utilizzando dateutil

3. Date e orari in numpy – datetime64 di numpy

Se stai gestendo grandi set di dati, datetime64 di numpy potrebbe tornare utile in quanto, grazie al suo design, può essere molto più veloce rispetto al lavoro con oggetti datetime e dateutil. Il tipo di dati datetime64 di numpy codifica date e orari come interi a 64 bit.

Questo archivia date e orari in modo compatto e consente operazioni vettorializzate (operazioni ripetute applicate a ogni elemento di un array numpy).

Come puoi vedere eseguendo il codice sopra, con un oggetto datetime o dateutil, le operazioni vettorializzate ti daranno un errore.

4. Date e orari in pandas

Pandas può essere una buona scelta quando si lavora su un progetto di dati di serie temporali.

La famosa libreria di manipolazione dei dati pandas combina la comodità di datetime e dateutil con la possibilità di memorizzazione e manipolazione efficace di numpy.

Crea un dataframe pandas (da CSV) analizzando una colonna di date

Ora, abbiamo una comprensione di base della gestione di date e orari in Python utilizzando numpy e pandas. Tuttavia, spesso non creiamo date e orari noi stessi, ma fanno già parte dell’insieme di dati con cui stiamo lavorando. Creiamo quindi un dataframe pandas con una colonna di date (dataset Kaggle NFL).

Come puoi vedere, quando si carica da un CSV, la colonna che contiene una data viene convertita in un formato di stringa se non specificato in modo preciso. Per ricevere il formato data, potresti creare una colonna aggiuntiva chiamata “gameDate_dateformat” o passare direttamente la colonna di date tramite il parametro parse_dates in pd.read_csv().

Un’altra manipolazione utile quando si lavora con dati di serie temporali è la possibilità di filtrare per data/ora o suddividere un dataframe utilizzando data/ora. Ci sono due metodi per farlo: filtraggio/suddivisione o indicizzazione.

Filtraggio dei dataframe pandas per tempo

Assicurati che la data di soglia che usi per la suddivisione abbia lo stesso formato della colonna!

Se la colonna su cui si desidera filtrare ha il formato datetime (come nell’esempio), la data di confronto non può essere una data ma deve avere un formato datetime!

Indicizzazione dei dataframe pandas per tempo

È ancora più potente indicizzare un dataframe pandas per data o ora.

L’indicizzazione può essere particolarmente utile quando si lavora con serie temporali, in quanto ci sono metodi come le finestre mobili e lo spostamento temporale.

5. Creazione di caratteristiche da date e orari

Spesso, non siamo interessati alla data stessa, ma forse alla durata, al giorno della settimana o solo a una parte dell’orario, ad esempio l’anno. Per questo, datetime ma anche pandas forniscono alcune utili manipolazioni.

Differenza di tempo

Con pandas, puoi calcolare, ad esempio, la differenza tra due datetime. A tal fine, esamineremo un diverso dataset di viaggi Uber (dataset Kaggle Uber) con un timestamp di inizio e un timestamp di fine. È necessario effettuare una pre-elaborazione (eliminare la riga totale) per iniziare a esaminare il timedelta.

Estrai il giorno della settimana o il mese

Questo funziona leggermente diverso per il singolo oggetto datetime rispetto alla serie pandas. Mentre il giorno della settimana o il mese dell’oggetto datetime singolo possono essere accessibili direttamente aggiungendo un attributo (ad esempio .month) o un metodo (ad esempio weekday()), la serie pandas ha sempre bisogno dell’accessore .dt.

L’accessore dt. ti consente di accedere agli attributi e ai metodi specifici delle date da una serie di date.

Crea un ritardo di data/ora

Un’altra manipolazione utile per i dati di serie temporali potrebbe essere quella di aggiungere una colonna aggiuntiva che aggiunge un ritardo di una data o di un datetime.

Sommario

Per lavorare con oggetti data o ora in Python, è vantaggioso conoscere le basi del pacchetto integrato datetime (ad esempio date() o strftime() e strptime()). Zoneinfo è un nuovo pacchetto integrato (a partire dalla versione 3.9) che è più conveniente dei moduli di terze parti quando si lavora con fusi orari diversi. Dateutil è una libreria preziosa per manipolazioni di date e orari più avanzate quando si lavora con singoli oggetti di data, ad esempio l’analisi di stringhe complesse. Quando si lavora con date e orari in dataframe, serie o array, pandas combina i vantaggi di datetime, dateutil e numpy e funge da libreria conveniente.

Fonti

  • Modern Python Standard Library — Cookbook di Alessandro Molina (2018)
  • Python Data Science Handbook di Jake VanderPlas (2017)
  • Corso Datacamp: Working with Dates and Times in Python (2022)
  • https://dateutil.readthedocs.io/en/stable/
  • https://docs.python.org/3/library/datetime.html
  • https://docs.python.org/3/library/zoneinfo.html
  • https://peps.python.org/pep-0615/
  • https://github.com/stub42/pytz/blob/master/src/README.rst#issues–limitations