Ciao a tutti. Oggi vi mostriamo, in risposta ad una domanda che ci hanno fatto sul canale, come calcolare un intervallo temporale nella tabella degli attributi in QGIS, esprimendo la durata in giorni, ore e minuti. Abbiamo deciso però di spezzare la spiegazione in due post, un po’ perché preferiamo i post non troppo lunghi, un po’ perché così diamo il tempo alle nuove informazioni di sedimentare.
1. Il quesito: come calcolare un intervallo temporale da due campi contenenti data e ora
La domanda postaci da Daniele Addis è la seguente:
Daniele ci ha anche postato una immagine nella quale è possibile vedere qual è il formato in cui sono espresse le sue date e ore, che noi abbiamo riprodotto nello shapefile su cui abbiamo lavorato per risolvere il problema.
Quindi, per cominciare, abbiamo creato uno shapefile poligonale, i cui poligoni sono disegnati a caso, ma del resto in questo post la parte importante è quella informativa, non quella geometrica.
Nella tabella attributi dello shapefile, abbiamo poi replicato i campi come nella domanda. Abbiamo quindi aggiunto due campi, denominati ORA_INIZIO e ORA_FINE, entrambi di tipo testo e contenenti ciascuno la data e l’ora di inizio e fine evento, anche se scritti in formato leggermente diversi tra loro. Nel campo ORA_INIZIO, infatti, le ore e i minuti sono separati da un punto, nel campo ORA_FINE, invece, le ore e i minuti sono separati dai due punti. Questa piccola differenza, irrilevante per l’occhio e il cervello umano, è invece una differenza ben distinta per una macchina, quindi dovremo anche omogeneizzare il formato.
Per concludere il settaggio dei dati, noi abbiamo inserito tre record:
- un primo record in cui l’evento dura pochi minuti;
- nel secondo record l’intervallo temporale è di qualche ora;
- infine, nel terzo record, la durata è in termini di giorni, ore e minuti.
2. Formattazione dei campi data e ora finalizzati al calcolo di un intervallo temporale
Per prima cosa, quando si tratta di lavorare con campi contenenti data e ora, non amiamo molto lavorare con lo shapefile, perché non gestisce bene questi formati. Ad esempio, lo shapefile non è capace di gestire in uno stesso campo, contemporaneamente, la data e l’ora.
Ecco perché, prima di andare avanti a formattare i campi contenenti l’ora di inizio e l’ora di fine dell’evento, noi preferiamo esportare lo shapefile che abbiamo chiamato prova, in un geopackage.
Per fare questo clicchiamo con il tasto destro del mouse [scheda] sullo shapefile, scegliamo Esporta e successivamente Salva Elementi come. Nella finestra che si aprirà, Salva Vettore come, impostiamo come Formato di output il GeoPackage (1). Inoltre, diciamo a QGIS dove e con quale nome salvare questo file (2) Noi lo chiamiamo Intervallo. Clicchiamo su OK e adesso possiamo lavorare sul nostro Geopackage.
Dopo aver cliccato su Attiva modifiche (1) adesso creiamo due nuovi campi (2) che conterranno gli stessi valori di ORA_INIZIO e ORA_FINE, ma formattati in data e ora. Li chiamiamo, rispettivamente START (3) ed END ed entrambi saranno di tipo data e ora (4).
Dobbiamo adesso riempirli.
Cominciamo dal campo START.
Apriamo il calcolatore di campi cliccando sull’icona a forma di pallottoliere (cioè sul calcolatore di campi). Da qui possiamo dire a QGIS che il risultato dell’espressione che tra poco inseriremo la deve mettere dentro il campo START, quindi metto il check su aggiorna campo esistente (1)e nel menu a tendina scelgo il campo START (2).
Poi inseriamo la nostra espressione. La buttiamo lì (3), ma non vi spaventate, poi la spiegheremo pezzetto a pezzetto:
TO_DATETIME (CONCAT (SUBSTR(“ORA_INIZIO”,7,4), ‘/’, SUBSTR(“ORA_INIZIO”,4,2), ‘/’, LEFT(“ORA_INIZIO” ,2), ‘ ‘ , SUBSTR (“ORA_INIZIO” ,12,2), ‘:’, RIGHT(“ORA_INIZIO” ,2), ‘:00’ ))
Vediamo la spiegazione dei singoli pezzi dell’espressione.
Primo passo. Estraiamo l’ANNO
Abbiamo bisogno di una funzione che dica a QGIS: “Vai nel campo ORA_INIZIO. Estraimi i quattro caratteri che troverai a partire dalla settima cifra”. Questo lo si fa con la funzione SUBSTR ( ) settata come a schermo.
La funzione SUBSTR ( ) estrae da una stringa di testo contenuta, ad esempio, in un campo, una sottostringa della lunghezza da noi desiderata, a partire da un certo elemento. Nel nostro caso vediamo che la parte di stringa contenente l’anno comincia dal settimo carattere ed è espressa con 4 caratteri. Quindi con questa espressione QGIS considera i quattro caratteri che formano l’anno.
Ad esempio, dalla stringa 19/10/2021 14.30, verrà estratto solo 2021.
Secondo passo. Estraiamo il MESE
Questa volta vogliamo estrarre i 2 caratteri che occupano la quarta e la quinta posizione. Lo facciamo di nuovo con la funzione SUBSTR ( ), dicendolo questa volta, di partire dal quarto carattere e prendendone solo 2:
Terzo passo. Estraiamo il GIORNO
Utilizzeremo la funzione LEFT ( ). Questa ci permette di estrarre una sottostringa cominciando dal primo carattere posto alla sinistra della stringa. Dobbiamo specificare, però, quante lettere prendere. Nel nostro caso, per estrarre il giorno, estraiamo solo le prime due lettere. La funzione LEFT ( ) va quindi settata in questo modo:
Praticamente stiamo dicendo a QGIS, “Vai nel campo ORA_INIZIO e prendi i primi due caratteri.
Quarto passo. Estraiamo l’ORA
Ormai la funzione SUBSTR ( ) la conosciamo benissimo. Considerando che, i due caratteri che rappresentano l’ora si trovano in dodicesima e tredicesima posizione, sarà facilissimo impostarla:
Quinto passo. Estraiamo il MINUTO
Usiamo una funzione parente della funzione LEFT ( ), solo che funziona dall’altro lato: mi consente di estrarre un numero di caratteri da me definito presenti in una stringa partendo da destra. Noi la usiamo per estrarre le informazioni relative ai minuti, quindi diciamo a QGIS di estrarci le ultime due cifre da destra di quanto contenuto nel campo ORA_INIZIO.
Sesto passo. Combiniamo insieme tutte le informazioni
Per mettere in sequenza tutte le informazioni estratte fino ad ora serve una funzione che le concateni tutte insieme. Ci sono diversi modi per fare questo in QGIS. Questa volta usiamo la funzione CONCAT ( ) . Se in questa funzione inseriamo le funzioni usate per estrarre anno, mese, giorno, ora e minuti separati da una virgola, verranno combinati insieme.
CONCAT (SUBSTR(“ORA_INIZIO”,7,4), SUBSTR(“ORA_INIZIO”,4,2), LEFT(“ORA_INIZIO” ,2), SUBSTR (“ORA_INIZIO” ,12,2), RIGHT(“ORA_INIZIO” ,2))
Tuttavia, il risultato di quello che è scritto nell’espressione, al momento, non è né bello né funzionale. Considerando il solito esempio 19/10/2021 14.30, dopo l’espressione diventerà 202110191430, cioè un risultato molto poco leggibile.
Per migliorare il risultato basta aggiungere qualche slash, uno spazio e due punti per migliorare subito la leggibilità del risultato. Quindi lo slash, lo spazio e i due punti dovranno essere inseriti opportunamente nell’espressione, tra le diverse funzioni, separati da virgole e posti tra apici. Questa è l’espressione di concatenazione finale:
CONCAT (SUBSTR(“ORA_INIZIO”,7,4), ‘/’, SUBSTR(“ORA_INIZIO”,4,2), ‘/’, LEFT(“ORA_INIZIO” ,2), ‘ ‘ , SUBSTR (“ORA_INIZIO” ,12,2), ‘:’, RIGHT(“ORA_INIZIO” ,2), ‘:00’)
Abbiamo aggiunto anche un :00 finale per specificare i secondi
Settimo passo. Trasformiamo la stringa ottenuta nel formato data/ora
Tutto quello che abbiamo scritto fino ad ora restituisce come risultato una stringa di testo. Vogliamo convertirla nel formato data/ora. Per fare questo basta ricorrere alla funzione TO_DATETIME ( ) che fa proprio questo: converte stringhe di testo in data e ora. L’espressione finale è fatta quindi in questo modo:
TO_DATETIME ( CONCAT (SUBSTR(“ORA_INIZIO”,7,4), ‘/’, SUBSTR(“ORA_INIZIO”,4,2), ‘/’, LEFT(“ORA_INIZIO” ,2), ‘ ‘ , SUBSTR (“ORA_INIZIO” ,12,2), ‘:’, RIGHT(“ORA_INIZIO” ,2), ‘:00’ ) )
Clicchiamo su OK. La nostra data sarà copiata all’interno del campo START.
Possiamo ripetere la stessa operazione nel campo END, sempre di tipo Data e Ora. L’espressione sarà identica a meno del campo da usare come dato di input, che non sarà più ORA_INIZIO, ma ORA_FINE.
TO_DATETIME ( CONCAT (SUBSTR(“ORA_ FINE “,7,4), ‘/’, SUBSTR(“ORA_ FINE “,4,2), ‘/’, LEFT(“ORA_ FINE ” ,2), ‘ ‘ , SUBSTR (“ORA_ FINE ” ,12,2), ‘:’, RIGHT(“ORA_ FINE ” ,2), ‘:00’ ) )
La prima parte del post è finita, se vuoi capire come calcolare l’intervallo temporale tra il campo START e il campo END non ti resta che aspettare il prossimo post.
Ovviamente, se conosci una soluzione più breve per fare tutto ciò e vuoi condividerla nei commenti, ne saremo più che contenti.
Bene, questo post è finito. Se ti è piaciuto condividilo! Hai dubbi o suggerimenti? Lascia pure un commento.
Puoi vedere anche il nostro video su YouTube “Q&A#2. Calcolare un intervallo temporale con QGIS in giorni, ore, minuti (parte I)” e iscriverti al nostro canale.
Ciaooo