Pages: 1
- Sujet précédent - QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation - Sujet suivant
#1 Wed 27 January 2021 14:14
- aheurion
- Participant actif
- Lieu: NANTES
- Date d'inscription: 8 Oct 2020
- Messages: 143
QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation
Bonjour,
Je suis face à un souci que je n'arrive pas à résoudre avec les outils à disposition :
Je dispose d'une couche de polyligne parent, liée à une couche csv non géométrique enfant. Cette couche CSV contient un historique des entités de la couche parent (parent A <=> enfant A1 avec date d1 + enfant A2 avec date d2 + etc..).
Je souhaite créer un champ dans ma couche parent contenant l'intervalle moyen entre deux dates pour chaque entité (ex : 01/01/2018 ; 01/01/2019 ; 01/01/2021 => intervalle moyen = 1.5 an).
Je suis parti sur l'idée suivante :
1) stocker les dates dans un tableau A (aggregate avec array_agg) et trier par dates croissantes
2) créer un tableau B à partir de A contenant les dates consécutives sauf la première
3) créer un tableau C à partir de A contenant les dates consécutives sauf la dernière
4) soustraire B à C
5) faire la moyenne de la soustraction
Voici l'expression que j'utilise :
with_variable(
'tableauA',
array_sort(
aggregate(
'id_de_ma_couche_enfant',
'array_agg',
"date",
"FOREIGN_KEY"=attribute(@parent,'PRIMARY_KEY')
)
),
mean(
age(
array_slice(@tableauA,1,array_length(@tableau0)), /* => le tableau B*/
array_slice(@tableauA,0,array_length(@tableau0)-1) /* => le tableau C*/
)
)
)
Mais QGIS me dit que l'expression est invalide (impossible de calculer l'aggrégat pour...)
Le champ que je veux calculer est un double, je me trompe peut-être là-dessus.
Ou bien est-ce lié à la soustraction entre les deux tableaux B et C ?
Merci d'avance pour vos retours !
EDIT :
alors j'ai trouvé 2 problèmes que j'ai réussi à résoudre :
1) Apparemment mean() ne fonctionne pas avec des arrays, mais il n'y a pas d'option équivalente dans QGIS en natif, donc il faut installer l'extension ArrayPlus qui rajoutera l'option array_avg()
2) Pour ce qui est de la soustraction de deux tableaux, j'ai remplacé age(tableauA,tableauB) par un petit bidouillage mais qui marche :
with_variable('tableauB',array_slice(@tableauA,1,array_length(@tableauA)-1),
with_variable('tableauC',array_slice(@tableauA,0,array_length(@tableauA)-2),
with_variable('tableauA2',array_foreach(@tableauB,epoch(@element)),
round(
array_avg(
array_foreach(@tableauA2,
year(
age(
array_get(@tableauB,array_find(@tableauA2,@element)),
array_get(@tableauC,array_find(@tableauA2,@element))
)
)
)
),
1
)
)
)
)
(je passe par un quatrième tableau A2 qui fait la taille de B et C mais qui contient des double/real plutôt que des dates (en transformant la date en epoch)
Dernière modification par aheurion (Wed 27 January 2021 18:05)
Hors ligne
#2 Thu 28 January 2021 13:26
- sylvain poupard
- Participant assidu
- Date d'inscription: 19 Mar 2009
- Messages: 362
Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation
Bonjour,
Si j'ai bien compris c'est l'écart-type que vous recherchez(?). Si oui regardez du côté de la fonction stdev.
J'ai testé stdev(date, Nom) depuis la couche contenant les entités filles et je me retrouve avec :
Nom | date en numérique | stdev
A 100 100
A 200 100
A 300 100
B 1 1
B 2 1
B 3 1
Ensuite j'ai fait une jointure 1-1 (vu que la valeur est identique avec le regroupement par "Nom") depuis les propriétés de la couche contenant les géométries et rempli le champs dédié.
J'ai essayé de le faire en dynamique via une couche virtuelle mais sans succès, peut-être qu'en allant voir du côté de postgre ça serait possible(?)
Merci pour vos retours.
Bon courage
Hors ligne
#3 Thu 28 January 2021 16:29
- aheurion
- Participant actif
- Lieu: NANTES
- Date d'inscription: 8 Oct 2020
- Messages: 143
Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation
Bonjour Sylvain, et merci pour ta réponse.
Alors je n'avais pensé à ça, et ça semble beaucoup plus simple que ma méthode ^^
J'ai essayé ainsi :
aggregate(
'id_de_ma_couche_enfant',
'stdev',
epoch("date"),
"FOREIGN_KEY"=attribute(@parent,'PRIMARY_KEY')
)/31557600000
(31557600000 étant le nombre de millisecondes dans une année)
J'utilise epoch pour transformer ma date en nombre, parce stdev ne semble pas fonctionner avec des dates.
Par contre je ne comprends pas pourquoi : avec cette formule et ces 3 dates-ci : [2019-01-01 ; 2020-01-01 ; 2021-01-01], cette nouvelle formule me donne un résultat différent : 0.8 ans d'écart, alors que ma formule précédente trouvait bien 1.0 pile
Si stdev donnait l'écart entre toutes les valeurs de dates, je devrais trouver un nombre plus grand que 1 non ? (moyenne des écarts=(1+1+2)/3)
Dernière modification par aheurion (Thu 28 January 2021 16:38)
Hors ligne
#4 Thu 28 January 2021 18:33
- sylvain poupard
- Participant assidu
- Date d'inscription: 19 Mar 2009
- Messages: 362
Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation
Re bonjour,
A partir d'un champs numérique, la fonction relation_aggregate me renvoie des résultat qui ont l'air correct :
'Renvoie une valeur agrégée, calculée à partir de toutes les entités enfants correspondantes dans la couche en relation.'
Syntaxe:
Code:
relation_aggregate(relation,aggregate,expression[,concatenator=''][,order_by])
Avec quelquechose comme :
Code:
relation_aggregate( 'ma_relation','stdev',"mon_champs_date_numérique")
(La relation étant à définir dans le projet)
Bon courage
Hors ligne
#5 Thu 28 January 2021 18:45
- sylvain poupard
- Participant assidu
- Date d'inscription: 19 Mar 2009
- Messages: 362
Re: QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation
...et avec une date :
Code:
relation_aggregate( 'ma_relation','stdev',epoch(to_date("mon_champ_date")))
Bon courage
Hors ligne
Pages: 1
- Sujet précédent - QGIS 3.16: Difference dates 2 a 2 consecutives dans champ relation - Sujet suivant