discretize
è il metodo più diretto per suddividere un vettore temporale in intervalli regolari di 10 minutiduration
permette maggiore flessibilità nella definizione degli intervalli temporali discretizzatiIl metodo più efficace per discretizzare un vettore temporale ogni 10 minuti in MATLAB è utilizzare la funzione discretize
in combinazione con la funzione minutes
.
% Supponendo che 'tempoVector' sia il tuo vettore temporale in formato datetime
% Discretizza il vettore ogni 10 minuti
[indiciIntervalli, estremiIntervalli] = discretize(tempoVector, minutes(10));
% 'indiciIntervalli' contiene gli indici degli intervalli a cui appartiene ogni elemento
% 'estremiIntervalli' contiene i bordi degli intervalli creati
% Creiamo un vettore temporale di esempio (una giornata con incrementi di 1 minuto)
inizio = datetime('2025-03-28 00:00:00');
fine = datetime('2025-03-28 23:59:00');
tempoVector = inizio:minutes(1):fine;
% Discretizziamo ogni 10 minuti
[indiciIntervalli, estremiIntervalli] = discretize(tempoVector, minutes(10));
% Per ottenere un vettore con solo i tempi discretizzati ogni 10 minuti
tempiDiscretizzati = inizio:minutes(10):fine;
% Visualizziamo i primi 10 elementi del risultato
disp(tempiDiscretizzati(1:10)');
Un altro approccio efficace consiste nell'utilizzare la funzione duration
per creare direttamente un vettore temporale discretizzato con incrementi di 10 minuti.
% Definiamo il tempo di inizio
tempoInizio = datetime('2025-03-28 00:00:00');
% Creiamo un vettore di durate (in minuti)
minuti = 0:10:1440; % da 0 a 24 ore (1440 minuti) con incrementi di 10 minuti
% Convertiamo in oggetti duration
durate = duration(0, minuti, 0); % 0 ore, X minuti, 0 secondi
% Creiamo il vettore temporale discretizzato
tempiDiscretizzati = tempoInizio + durate;
Se hai già un vettore temporale e vuoi estrarre solo gli elementi a intervalli di 10 minuti:
% Supponendo che 'tempoVector' sia un vettore datetime con incrementi regolari
% Estrai elementi ogni 10 minuti (se il tuo vettore ha incrementi di 1 minuto)
tempiDiscretizzati = tempoVector(1:10:end);
Se il tuo vettore temporale non ha incrementi regolari, puoi arrotondare ogni timestamp al più vicino intervallo di 10 minuti e poi rimuovere i duplicati.
% Supponendo che 'tempoVector' sia il tuo vettore di tempi non regolari
% Arrotonda ogni tempo al più vicino intervallo di 10 minuti
tempiArrotondati = dateshift(tempoVector, 'start', 'minute', 10);
% Rimuovi i duplicati per ottenere un vettore discretizzato
tempiDiscretizzati = unique(tempiArrotondati);
Puoi verificare facilmente i risultati visualizzando il vettore temporale originale e quello discretizzato:
% Genera alcuni dati di esempio
x = sin(linspace(0, 2*pi, length(tempoVector)));
y = sin(linspace(0, 4*pi, length(tempoVector)));
% Visualizza i dati originali
plot(tempoVector, x, 'b.-')
hold on
% Discretizza il tempo e interpola i dati
[~, idx] = ismember(tempiDiscretizzati, tempoVector);
idx = idx(idx > 0); % Rimuovi gli indici nulli
plot(tempiDiscretizzati, x(idx), 'ro-', 'LineWidth', 2)
datetick('x')
legend('Dati originali', 'Dati discretizzati (10 min)')
Se oltre a discretizzare il tempo, hai bisogno anche di interpolare i dati associati a questi tempi, puoi utilizzare la funzione interp1
.
% Supponendo che 'tempoVector' sia il vettore di tempi e 'dati' i valori associati
% Crea un nuovo vettore temporale discretizzato
tempoInizio = min(tempoVector);
tempoFine = max(tempoVector);
tempiDiscretizzati = tempoInizio:minutes(10):tempoFine;
% Interpola i dati sui nuovi tempi discretizzati
datiDiscretizzati = interp1(tempoVector, dati, tempiDiscretizzati);
% Ora 'tempiDiscretizzati' contiene i tempi a intervalli di 10 minuti
% e 'datiDiscretizzati' contiene i valori interpolati a questi tempi
Per aiutarti a scegliere il metodo più adatto alle tue esigenze, ecco una tabella comparativa delle diverse tecniche di discretizzazione:
Metodo | Vantaggi | Svantaggi | Scenario ideale |
---|---|---|---|
discretize | Diretto, ben documentato, flessibile con diverse opzioni | Richiede che il vettore sia già in formato datetime | Dataset temporali complessi che richiedono un'analisi binning |
duration | Intuitivo, permette di specificare durate precise | Può richiedere conversioni di formato | Creazione di serie temporali da zero |
Indicizzazione (1:10:end) | Estremamente semplice, nessuna funzione aggiuntiva | Funziona solo se il vettore ha già incrementi uniformi | Dataset uniformi dove si vuole semplicemente ridurre la risoluzione |
Arrotondamento | Funziona con dati non uniformi | Può modificare i valori temporali originali | Dati acquisiti a intervalli irregolari |
Interpolazione | Preserva l'informazione sui dati associati | Più complesso, introduce valori stimati | Analisi di segnali o serie temporali |
Ecco un esempio completo che mostra come discretizzare i dati di temperatura raccolti ogni minuto durante una giornata:
% Genera dati di esempio (una giornata di temperature, misurate ogni minuto)
tempoInizio = datetime('2025-03-28 00:00:00');
tempoFine = datetime('2025-03-28 23:59:00');
tempoVector = tempoInizio:minutes(1):tempoFine;
% Genera temperature simulate (con variazione sinusoidale e rumore)
ore = (0:length(tempoVector)-1)/60; % ore del giorno
temperatura = 15 + 8*sin(2*pi*(ore-8)/24) + randn(size(ore))*0.5; % °C
% Discretizza il tempo ogni 10 minuti
tempiDiscretizzati = tempoInizio:minutes(10):tempoFine;
% Interpola i dati di temperatura sui tempi discretizzati
temperaturaDiscretizzata = interp1(tempoVector, temperatura, tempiDiscretizzati);
% Visualizza i risultati
figure
plot(tempoVector, temperatura, 'b.', 'MarkerSize', 1)
hold on
plot(tempiDiscretizzati, temperaturaDiscretizzata, 'ro-', 'LineWidth', 1.5)
xlabel('Orario')
ylabel('Temperatura (°C)')
title('Discretizzazione dei dati di temperatura ogni 10 minuti')
legend('Dati originali (1 min)', 'Dati discretizzati (10 min)')
datetick('x', 'HH:MM')
grid on