Comment convertir un champ de chaîne en un champ de date

9

J'ai une couche avec des points qui représentent les accidents de la route mortels et le champ "dates_14_D" contient leur date mais son type est une chaîne. Je voudrais convertir ce champ de chaîne en champ de date mais le bouton OK est inactif. Quel est le problème? J'utilise QGis. Regardez l'image ci-dessousentrez la description de l'image ici

ilias m
la source
1
Que dit-on quand on clique sur "plus d'infos"?
Matthias Kuhn
Je pense que le format de la date est incorrect; QGIS attend quelque chose comme «AAAA-MM-JJ».
ArMoraer
Erreur d'analyse: erreur d'évaluation: la conversion «% 1» n'a pas été possible.
ilias m
J'ai converti le format comme @ArMoraer a dit et j'ai répété la procédure mais encore une fois le bouton OK est inactif.
ilias m

Réponses:

13

Je suis surpris de ne pas l'avoir vu auparavant. Peut-être que j'oublie quelque chose d'évident :)

Bien que vous utilisiez des paramètres régionaux différents de moi, vous utilisez le même format de date que moi au Royaume-Uni, jj / mm / aaaa. J'obtiens une erreur légèrement différente (sur QGIS 2.16.1) mais il n'aime pas ce format de date.

Vous pouvez contourner cela en créant un court script python dans l'onglet de l'éditeur de fonction de l'éditeur d'expression.

  • Allez dans l'onglet de l'éditeur de fonction dans l'éditeur d'expression
  • Créer une nouvelle fonction (bouton "Nouveau fichier")
  • collez ce qui suit dans la fenêtre de code. Vous pouvez obtenir des erreurs d'indentation, donc ré-indentez manuellement avec des espaces si nécessaire
  • cliquez sur le bouton "Charger" pour enregistrer les modifications
  • revenir à l'onglet expression
  • regardez sous le titre python, devrait maintenant voir une fonction appelée 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')

Vous pouvez ensuite saisir une expression comme celle-ci, en utilisant le nom de votre champ: -

parse_date_dmy("mydate") 

Si tout va bien, vous devriez voir quelque chose comme ça ...

entrez la description de l'image ici

Steven Kay
la source
Merci beaucoup pour votre réponse détaillée. Ça a marché. Mais, pour certaines dates, le résultat était nul. Y a-t-il une explication?
ilias m
1
essayez d / M / yyyy comme chaîne de format (voir la spécification de chaîne de format de date Qt , bien que notez qu'il s'agit d'une page Qt5). Je l'ai testé pendant des jours et des mois avec des chiffres simples et doubles et cela semblait bien fonctionner. Si cela fonctionne, je mettrai à jour ma réponse.
Steven Kay
La première fois que j'exécute cette procédure, le format de la date était d / M / yyyy. J'ai à nouveau essayé de l'exécuter avec le format d / M / yyyy et le résultat de certains enregistrements était nul comme mentionné ci-dessus. De plus, je l'exécute au format jj / mm / aaaa et le résultat était que tous les enregistrements étaient nuls. Ai-je fait quelque chose de mal?
ilias m
1

Ou utilisez simplement:

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

Avec MAJ comme champ de date (jj / MM / AAAA).

J. Sabatier
la source
1

Une mise à jour pour QGIS 3 de la réponse limpide de @Steven Kay

Vous pouvez contourner cela en créant un court script python dans l'onglet de l'éditeur de fonction de l'éditeur d'expression.

  • Allez dans l'onglet de l'éditeur de fonction dans l'éditeur d'expression
  • Créer une nouvelle fonction (bouton "Nouveau fichier")
  • collez ce qui suit dans la fenêtre de code. Vous pouvez obtenir des erreurs d'indentation, donc ré-indentez manuellement avec des espaces si nécessaire
  • cliquez sur le bouton "Charger" pour enregistrer les modifications
  • revenir à l'onglet expression
  • regardez sous le titre python, devrait maintenant voir une fonction appelée 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')

Vous pouvez ensuite saisir une expression comme celle-ci, en utilisant le nom de votre champ: -

parse_date_dmy("mydate") 

Si tout va bien, vous devriez voir quelque chose comme ça ...

entrez la description de l'image ici

Roberto Zeeland
la source