DatetimeIndex e intervalli di periodi
Crei un DatetimeIndex con pd.date_range, analizzi le date in formato stringa e imposti una colonna temporale come indice per l'accesso basato sul tempo.
DatetimeIndex e intervalli di periodi è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Perché Pandas dispone di strumenti temporali specifici
I dati di serie temporali richiedono più della semplice memorizzazione delle date come stringhe. È necessario ordinarli in base al tempo, selezionare intervalli di date, ricampionare a frequenze diverse ed estrarre componenti come mese e giorno della settimana. Pandas risponde a queste esigenze con DatetimeIndex — un indice costituito da valori datetime64 — che abilita operazioni specializzate sensibili al tempo, non disponibili con i normali indici interi o stringa.
Creare un DatetimeIndex con pd.date_range()
pd.date_range(start, end, freq) genera una sequenza di date equidistanti. Il parametro freq specifica l'intervallo usando gli alias degli offset: 'D' per il giorno, 'h' per l'ora, 'ME' per la fine del mese, 'W' per la settimana, 'YE' per la fine dell'anno. Può passare end oppure periods (il numero di timestamp), ma non entrambi.
import pandas as pd
# Daily dates for January 2024
dates = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')
print(dates)
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03',
# '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07'],
# dtype='datetime64[ns]', freq='D')
# 12 month-end dates
months = pd.date_range(start='2024-01-31', periods=12, freq='ME')
print(months[:3])Impostare un DatetimeIndex su un DataFrame
Per abilitare le operazioni basate sul tempo, imposti la colonna delle date come indice del DataFrame usando set_index(), dopo averla convertita in datetime64 con pd.to_datetime(). Quando l'indice è un DatetimeIndex, può usare l'indicizzazione parziale tramite stringa (df['2024-01']), l'uso di intervalli di date e tutti i metodi sensibili al tempo.
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'value': [10, 15, 12]
})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df)
# value
# date
# 2024-01-01 10
# 2024-01-02 15
# 2024-01-03 12
print(type(df.index)) # DatetimeIndexIndicizzazione parziale tramite stringa
Una delle funzionalità più pratiche di un DatetimeIndex è l'indicizzazione parziale tramite stringa. Può selezionare le righe per anno, mese o data passando una stringa di data parziale a .loc[]. Ad esempio, df.loc['2024-01'] restituisce tutte le righe di gennaio 2024, mentre df.loc['2024'] restituisce tutte le righe del 2024. Non è necessario confrontare esplicitamente i valori delle colonne.
# Create a larger date-indexed Series
s = pd.Series(
range(365),
index=pd.date_range('2024-01-01', periods=365, freq='D')
)
# Select all of January 2024
print(s.loc['2024-01'].shape) # (31,)
# Select a specific date range
print(s.loc['2024-03-01':'2024-03-07'])pd.to_datetime() per l'analisi sintattica
pd.to_datetime() converte stringhe, interi (timestamp Unix) o colonne di date in formati misti in datetime64. Passi format per specificare lo schema esatto se le date sono in un formato non standard (ad esempio, '%d/%m/%Y'). Usi errors='coerce' per convertire i valori non analizzabili in NaT (Not a Time) invece di generare un errore.
# Parse standard ISO format
print(pd.to_datetime('2024-06-15'))
# Parse non-standard format
print(pd.to_datetime('15/06/2024', format='%d/%m/%Y'))
# Handle mixed/bad data gracefully
mixed = pd.to_datetime(['2024-01-01', 'bad_date', '2024-06-15'],
errors='coerce')
print(mixed) # NaT for 'bad_date'L'accessor .dt per i componenti temporali
Quando una colonna del DataFrame (non l'indice) contiene valori datetime64, l'accessor .dt espone tutte le proprietà e i metodi relativi a data e ora sul vettore della colonna, in modo vettoriale. Lo usi per estrarre .dt.year, .dt.month, .dt.day, .dt.day_of_week, .dt.hour e così via, senza cicli. Se il valore datetime è l'indice, usi direttamente df.index.year.
df_col = pd.DataFrame({'date': pd.date_range('2024-01-01', periods=5, freq='D'),
'value': [10, 15, 12, 18, 14]})
df_col['year'] = df_col['date'].dt.year
df_col['month'] = df_col['date'].dt.month
df_col['dow'] = df_col['date'].dt.day_of_week # 0=Monday
df_col['week'] = df_col['date'].dt.isocalendar().week
print(df_col.head())Intervalli di periodi con pd.period_range()
Un PeriodIndex rappresenta intervalli di tempo anziché timestamp specifici. pd.period_range(start, periods, freq) crea periodi mensili, trimestrali o annuali. Un periodo come Period('2024-01', 'M') rappresenta l'intero mese di gennaio 2024, non solo la sua data di inizio. PeriodIndex è utile per la reportistica fiscale, quando si ragiona in termini di trimestri o mesi.
# Monthly periods
periods = pd.period_range('2024-01', periods=6, freq='M')
print(periods)
# PeriodIndex(['2024-01', '2024-02', '2024-03',
# '2024-04', '2024-05', '2024-06'],
# dtype='period[M]')
# Quarterly periods
quarters = pd.period_range('2024Q1', periods=4, freq='Q')
print(quarters) # [2024Q1, 2024Q2, 2024Q3, 2024Q4]Convertire tra Timestamp e Period
Può convertire un DatetimeIndex in un PeriodIndex con to_period(freq) e riconvertirlo con to_timestamp(). La conversione in periodi è utile quando desidera etichettare le righe per mese o trimestre anziché per un giorno specifico, rendendo più intuitivi il raggruppamento e l'aggregazione nelle analisi basate sul calendario.
daily_idx = pd.date_range('2024-01-15', periods=5, freq='D')
print('DatetimeIndex:', daily_idx[:3])
# Convert to monthly periods
monthly_idx = daily_idx.to_period('M')
print('PeriodIndex:', monthly_idx[:3])
# PeriodIndex(['2024-01', '2024-01', ...], dtype='period[M]')
# Convert back to timestamps (start of period)
print(monthly_idx.to_timestamp()[:3])Gestione dei fusi orari
Le serie temporali del mondo reale includono spesso informazioni sul fuso orario. Pandas supporta DatetimeIndex con fuso orario tramite tz_localize() (associa un fuso orario a timestamp privi di fuso) e tz_convert() (converte tra fusi orari). Lavori sempre internamente in UTC e converta all'ora locale solo per la visualizzazione, così da evitare bug dovuti alle ambiguità legate all'ora legale.
naive = pd.date_range('2024-01-01', periods=3, freq='D')
print('Naive:', naive.tz)
# Attach timezone (localize)
utc = naive.tz_localize('UTC')
print('UTC:', utc)
# Convert to New York time
ny = utc.tz_convert('America/New_York')
print('NY:', ny[:2])Controllare e ordinare il DatetimeIndex
Le operazioni sulle serie temporali, come il ricampionamento e l'uso di intervalli, richiedono che il DatetimeIndex sia ordinato (in ordine monotonamente crescente). Verifichi con df.index.is_monotonic_increasing e ordini con df.sort_index() se necessario. Un DatetimeIndex non ordinato può causare errori silenziosi o risultati imprevisti nel ricampionamento e nelle funzioni a finestra.
import numpy as np
df_unsorted = pd.DataFrame(
{'value': [10, 15, 12]},
index=pd.to_datetime(['2024-01-03', '2024-01-01', '2024-01-02'])
)
print('Sorted:', df_unsorted.index.is_monotonic_increasing) # False
df_sorted = df_unsorted.sort_index()
print('After sort:', df_sorted.index.is_monotonic_increasing) # True
print(df_sorted)Schema pratico: creare un DataFrame di serie temporali
Ecco uno schema completo per creare un DataFrame indicizzato temporalmente a partire da dati grezzi: analizzare le date, impostare l'indice, ordinare e verificare la frequenza dell'indice. Questa configurazione è la base per tutte le analisi di serie temporali delle lezioni successive: ricampionamento, medie mobili e variabili ritardate dipendono da un DatetimeIndex pulito e ordinato.
import numpy as np
# Simulate loading raw data
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
df_ts = pd.DataFrame({'sales': np.random.randint(100, 500, 30)}, index=dates)
df_ts.index.name = 'date'
print('Shape:', df_ts.shape)
print('Freq:', df_ts.index.freq)
print('Sorted:', df_ts.index.is_monotonic_increasing)
print(df_ts.head())Controllo rapido
Verifichi la Sua comprensione di DatetimeIndex e degli intervalli di periodi presentati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato a creare un DatetimeIndex con pd.date_range() e ad analizzare le date con pd.to_datetime(), a usare l'indicizzazione parziale tramite stringa per selezionare intuitivamente le date, la differenza tra i tipi Timestamp e Period e come gestire i fusi orari. Prossimamente esploreremo il ricampionamento per modificare la frequenza di una serie temporale.
Domande Frequenti
La lezione «DatetimeIndex e intervalli di periodi» è gratuita?
Sì — il testo completo di «DatetimeIndex e intervalli di periodi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «DatetimeIndex e intervalli di periodi»?
Crei un DatetimeIndex con pd.date_range, analizzi le date in formato stringa e imposti una colonna temporale come indice per l'accesso basato sul tempo. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «DatetimeIndex e intervalli di periodi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- DatetimeIndex e intervalli di periodi
- Ricampionare serie temporali
- Shift e variabili ritardate
- Estrarre caratteristiche temporali