Come convertire un campo stringa in un campo data


9

Ho uno strato con punti che rappresentano gli incidenti stradali mortali e il campo "date_14_D" contiene la loro data ma il suo tipo è stringa. Vorrei convertire questo campo stringa in campo data ma il pulsante OK non è attivo. Qual è il problema? Uso QGis. Guarda l'immagine sottoinserisci qui la descrizione dell'immagine


1
Cosa dice quando si fa clic su "maggiori informazioni"?
Matthias Kuhn,

Penso che il formato della data sia sbagliato; QGIS prevede qualcosa come "AAAA-MM-GG".
ArMoraer,

Errore di analisi: errore di valutazione: la conversione "% 1" non è stata possibile.
ilias m,

Ho convertito il formato come ha detto @ArMoraer e ho ripetuto la procedura ma il pulsante OK è nuovamente inattivo.
ilias m,

Risposte:


13

Sono sorpreso di non averlo mai visto prima. Forse sto trascurando qualcosa di ovvio :)

Anche se stai usando una lingua diversa da me, stai usando lo stesso formato di data che faccio nel Regno Unito, gg / MM / aaaa. Ricevo un errore leggermente diverso (su QGIS 2.16.1) ma non mi piace quel formato data.

Puoi aggirare questo problema creando un breve script Python nella scheda dell'editor delle funzioni dell'editor delle espressioni.

  • Vai nella scheda dell'editor delle funzioni nell'editor delle espressioni
  • Crea una nuova funzione (pulsante "Nuovo file")
  • incolla quanto segue nella finestra del codice. È possibile che si verifichino errori di rientro, quindi reinserire manualmente gli spazi se necessario
  • fare clic sul pulsante "Carica" ​​per salvare le modifiche
  • tornare alla scheda delle espressioni
  • guarda sotto l'intestazione python, ora dovrebbe vedere una funzione chiamata parse_date_dmy

from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import QDate

@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
    return QDate.fromString(fromval, 'dd/MM/yyyy')

È quindi possibile inserire un'espressione simile, usando il nome del campo: -

parse_date_dmy("mydate") 

Se tutto va bene, dovresti vedere qualcosa del genere ...

inserisci qui la descrizione dell'immagine


Grazie mille per la risposta dettagliata. Ha funzionato. Ma, per alcune date, il risultato è stato nullo. C'è qualche spiegazione?
ilias m,

1
prova d / M / yyyy come stringa di formato (vedi Specifiche stringa di formato data Qt , sebbene si noti che questa è una pagina Qt5). L'ho provato in giorni e mesi con cifre singole e doppie e sembrava funzionare bene. Se funziona, aggiorno la mia risposta.
Steven Kay,

La prima volta che eseguo questa procedura, il formato della data era g / g / aaaa. Ho provato a eseguirlo di nuovo con il formato d / M / yyyy e il risultato di alcuni record è stato nullo come sopra menzionato. Inoltre, lo eseguo con il formato gg / MM / aaaa e il risultato è stato che tutti i record erano nulli. Ho sbagliato sth?
ilias m,

1

O semplicemente usa:

to_date( regexp_substr( "MAJ" , '/(\\d+$)' ) || '-' || regexp_substr( "MAJ" , '/(\\d+)/' ) || '-' || regexp_substr( "MAJ" , '^(\\d+)/' ) )

Con MAJ come campo della data (gg / MM / AAAA).


1

Un aggiornamento per QGIS 3 della risposta cristallina di @Steven Kay

Puoi aggirare questo problema creando un breve script Python nella scheda dell'editor delle funzioni dell'editor delle espressioni.

  • Vai nella scheda dell'editor delle funzioni nell'editor delle espressioni
  • Crea una nuova funzione (pulsante "Nuovo file")
  • incolla quanto segue nella finestra del codice. È possibile che si verifichino errori di rientro, quindi reinserire manualmente gli spazi se necessario
  • fare clic sul pulsante "Carica" ​​per salvare le modifiche
  • tornare alla scheda delle espressioni
  • guarda sotto l'intestazione python, ora dovrebbe vedere una funzione chiamata parse_date_dmy

from qgis.core import *
from qgis.gui import *
from PyQt5.QtCore import QDate

@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
    return QDate.fromString(fromval, 'dd/MM/yyyy')

È quindi possibile inserire un'espressione simile, usando il nome del campo: -

parse_date_dmy("mydate") 

Se tutto va bene, dovresti vedere qualcosa del genere ...

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.