Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre averti
    Moyenne annuelle avec dates pouvant englober plusieurs années
    Bonjour à tous,

    Je dispose d'un fichier comprenant une variable d'intérêt prenant une valeur différente à chaque pas de temps. Ces pas de temps sont définis avec 2 variables : date_deb et date_fin.
    Ainsi cette table ressemble à ça :
    date_deb date_fin variable_interet
    01/01/2000 31/12/2000 100
    01/01/2001 30/06/2001 110
    01/07/2001 31/12/2001 120
    01/01/2002 30/09/2005 130
    01/10/2005 28/02/2006 140
    01/03/2006 31/12/2006 150
    01/01/2007 31/12/2007 155

    J'aimerais calculer la moyenne annuelle de ma variable d'intérêt pour chaque année entre ma première année et ma dernière année. Si mes dates de début et de fin étaient toujours sur une même année, je pourrais calculer un intervalle de temps puis faire une moyenne pondérée par cette intervalle de temps en groupant selon l'année, mais j'ai quelques fois des intervalles de temps qui englobent plusieurs années.

    Dans l'idéal, je souhaiterais même ne pas fonctionner avec un nombre de jours, mais uniquement de mois afin que la moyenne annuelle ne soit pas sensible aux mois plus courts, mes dates étant tout le temps définies avec une date_debut au premier du mois, et une date_fin à la fin d'un mois. Ce problème est moins important cependant.

    Je n'arrive pas à trouver de manière de faire (à moins peut-être d'une usine à gaz du genre, faire une boucle partant de l'année la plus ancienne à l'année la plus récente et, pour chaque année, effectuer le calcul en parcourant toute la table à chaque fois...) Avant de me lancer dans l'écriture d'un code long et fastidieux, peut-être que quelqu'un aurait une idée pour me débloquer ?

    Par avance merci !

  2. #2
    Membre averti
    Finalement, la pause midi porte conseil. L'idée usine à gaz n'est pas si horrible que ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    data test2;
    set test;
    	if year(date_deb)=year(date_fin) then do;
    		annee=year(date_deb);
    		mois=month(date_fin)+1-month(date_deb);
    		vari = var_interet;
    		output;
    	end;
    	else do an=year(date_deb) to year(date_fin);
    		annee = an;
    		mois = (an ne year(date_fin))*(13-(month(date_deb)*(an=year(date_deb))+1*(an ne year(date_deb))))
     				+ (an=year(date_fin))*month(date_fin);
    		vari = var_interet;
    		output;
    	end;
    	keep annee mois vari;
    run;
    proc sql;
    create table test3 as
    select annee, sum(vari*mois/12) as vari_MA
    from test2
    group by annee;
    quit;


    Et ça a l'air de bien marcher !!