Suite

Comment calculer avec des valeurs temporelles dans QGIS ?

Comment calculer avec des valeurs temporelles dans QGIS ?


J'ai deux champs de chaîne dans une couche vectorielle, "De" et "À", avec des valeurs au format de10:16:30et10:18:00par exemple.

Je voudrais calculer la différence en minutes sous forme de valeur décimale, dans ce cas 1,5, dans la calculatrice de champ et l'écrire dans un champ réel pour d'autres calculs.

Comme je l'ai compris jusqu'à présent, je dois convertir mes chaînes en type de temps QT en utilisanttotime("De")ettotime("À").

Mais maintenant j'ai déjà atteint la fin de ma sagesse. Peu importe ce que j'essaie, la calculatrice de champ n'accepte aucune autre combinaison d'autres fonctions (l'expression n'est pas valide).

Quelqu'un peut-il me dire comment effectuer ce calcul et recevoir un champ réel avec une valeur réelle en minutes, ou peut-il m'indiquer des ressources avec des exemples de travail ?


Si vous utilisez la version 2.8 ou ultérieure, vous pouvez utiliser le générateur de fonctions Python. Ce code fera le calcul. Je ne pense pas que vous ayez besoin d'utiliser des objets Qt pour cela.

de qgis.core import * de qgis.gui import * de datetime import datetime import time @qgsfunction(args=2, group="Python") def timedifference(values,feature,parent):"appelez cette fonction comme timedifference("fromtime ","totime") pas besoin de transmettre la fonctionnalité/parent"fromtime = datetime.strptime(values[0], "%H:%M:%S") totime = datetime.strptime(values[1], "% H:%M:%S") a = totime - fromtime return a.seconds/60.0

Enregistrez ce script sous le nom 'timedifference'. Revenez à l'éditeur d'expressions.

Vous pouvez ensuite utiliser la fonction dans l'éditeur d'expression. Vous devriez le trouver regroupé sous 'Python'

timedifference("from_field","to_field")

J'ai supposé ici que "from_field" et "to_field" sont des champs de chaîne et que "to_field" est postérieur à "from_field".

Si vous êtes nouveau dans le générateur de fonctions Python, il y a une vidéo pratique ici sur youtube

ÉDITER: Je n'ai pas assez de représentant pour commenter la réponse de Nyall (je viens de rejoindre SO) mais c'est une bonne réponse, beaucoup plus élégante.

Avec un petit ajustement, je suggère ceci:

minute( age( todatetime('2000-01-01 ' || "timeto" ), todatetime('2000-01-01 ' || "timefrom" ) ) )

N'oubliez pas d'ajouter l'espace de fin après la date. La fonction age() semble supposer que la date ultérieure est le premier paramètre.


C'est possible sans utiliser de fonction python, avec un peu de hacks :

minute( âge( heure actuelle('2000-01-01 10:18:00'), heure actuelle(2000-01-01 10:16:30') ) )

renverra "1.5".

Pour le décomposer, "age" renvoie la différence entre deux dates-heures sous la forme d'un type d'intervalle. Cela doit être enveloppé dans la fonction "minute" pour extraire la longueur de cet intervalle en minutes. Enfin, j'ai dû mettre des dates factices dans les fonctions "todatetime" car la fonction "age" ne fonctionne que sur les types datetime, pas sur les heures simples.


Voir la vidéo: Miten käsittelen kellonaikoja Excelissä