IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

MATLAB Discussion :

Indice consecutive dry day (CDD) quand il manque une date et donc il y a un NaN


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Doctorant
    Inscrit en
    Mai 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 76
    Par défaut Indice consecutive dry day (CDD) quand il manque une date et donc il y a un NaN
    Bonjour,

    Cherchant à calculer des jours consécutifs de pluie le code de Kmaniche (voir cette discussion) est correct,
    exemple j'ai la matrice "a" suivante
    ligne 1 les dates AAAA/MM/JJ et ligne 2 des valeurs de précipitations
    a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    20010101	20010102	20010103	20010104	20010105	20010107       20010108  	20010109    	 20010110	20010111	20010112	20010113
    1	        1	        17	        7	        2	        2              8	        0	        13	           5	           2	           2
    J'applique donc son code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [snz, nbnz] = nonzeros2(a(:,2))
    J'obtiens donc
    snz= [7 4] qui est la taille des séquences pluvieuses, et nbnz=2 qui est le nombre de séquences pluvieuses
    De plus je calcul un indice qui me donne le nombre d'évènement où j'ai des jours consécutif de pluie de 6 jour ou plus
    J'ai donc ici dans mon cas CWD6j= 1

    Or dans mon vecteur date je m’aperçois qu'il me manque le 20010106. Je souhaite donc un code qui m'arrete de compter lorsqu'il manque une date car j'ai 10 ans de données journalières et donc par moment plusieurs trous.
    Dans ce cas j'aimerai obtenir snz= [5 2 4], et nbnz=3 et à ce moment CWD6j= 0

    Pour cela j'ai crée un vecteur time complet avec toutes les dates et j'y affecte les valeur NaN. A l'aide de la fonction ismember je reconstitue mon vecteur complet avec des NaN là où il me manque une date. J'ai donc à présent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    20010101	20010102	20010103	20010104	20010105	20010106     20010107	    20010108	 20010109   20010110	   20010111	   20010112	   20010113
    1	        1	        17	        7	        2	        NaN          2              8	         0	    13	           5	           2	           2
    Mais lorsque je reprend le code de Kmaniche il prend pas les NaN, je ne peux pas pas calculer snz et nbnz, alors que moi j'aimerai qu'il s’arrête de compter dès qu'il voit un 0 ou bien un NaN

    la fonction nonzeros2 de kmaniche est disponible ici

    Quelqu'un as t-il la solution ? Cela fait plusieurs semaines que je bloque.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Pourquoi ne pas simplement mettre des 0 à la place des NaN ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu as au moins deux solutions :
    • Mettre des 0 et non des NaN ;
    • Rentrer [snz, nbnz] = nonzeros2( a(:,2) ~= 0 & ~isnan(a(:,2)) ) dans la fonction nonzeros2 de kmaniche.

  4. #4
    Membre confirmé
    Femme Profil pro
    Doctorant
    Inscrit en
    Mai 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 76
    Par défaut
    Je ne voulais pas mettre de zéro car en plus du calcul de jours consécutif pluvieux je dois calculer les jours consécutif sec (donc égal à zéro) et dans le code de kmaniche j'ai juste à mettre le tilde devant "a"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [snz, nbnz] = nonzeros2(~a(:,2))
    La deuxième solution marche c'est super
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [snz, nbnz] = nonzeros2( a(:,2) ~= 0 & ~isnan(a(:,2)) )
    Merci

  5. #5
    Membre confirmé
    Femme Profil pro
    Doctorant
    Inscrit en
    Mai 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 76
    Par défaut
    J'ai un autre problème. Maintenant je souhaite garder que les dates qui correspondent seulement aux jours consécutif pluvieux supérieur ou égale à 3 jours que l'on observe sur les précipitations observées (ligne 2)
    Je souhaite faire de la comparaison statistique entre les observées et les estimées. Le code de Kmaniche me calcul simplement le nombre d’événements consécutif et grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CWD3j_SAT= sum(snz>=3);
    j'obtenais le nombre d'évènements pluvieux supérieur ou égal à 3 jours consécutifs mais moi cette fois ci je souhaite garder la matrice et supprimer de celle-ci les jours de non pluie et les événements pluvieux inférieur à 3 jours.
    Par la suite je souhaite faire la même chose pour les événements consécutifs secs. Dès que j'ai moins de 3 jours secs consécutifs je supprime ces jours et je ne garde que les événements secs (<1) supérieur ou égal à 3 jours.

    Ligne 1 les dates
    Ligne 2 les précipitations observées
    Ligne 3 les précipitations estimées

    exemple j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    20010101	20010102	20010103	20010104	20010105	20010106     20010107	    20010108	 20010109   20010110	   20010111	   20010112	   20010113
    1	        1	        17	        7	        2	        NaN          2              8	         0	    13	           5	           2	           2
    0               1               6               4               0               NaN          0              7            1          9              4               4               6
    et j'aimerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    20010101	20010102	20010103	20010104	20010105	20010110	   20010111	   20010112	   20010113
    1	        1	        17	        7	        2	        13	           5	           2	           2
    0               1               6               4               0               9                  4               4               6
    En effet le 06 janvier est supprimé car NaN
    Le 09 janvier est supprimé car il vaut 0 pour les précipitations observées
    Le 07 et 08 janvier est supprimé car il y a juste 2 jours consécutif et non 3 donc on enlève également les jours pour les précipitations estimées

  6. #6
    Invité
    Invité(e)
    Par défaut
    Une solution :
    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
    data = [...
        20010101    20010102    20010103    20010104    20010105    20010106    20010107    20010108    20010109    20010110    20010111    20010112    20010113
               1           1          17           7           2         NaN           2           8           0          13           5           2           2
               0           1           6           4           0         NaN           0           7           1           9           4           4           6];
     
    nbMinConsecutive = 3;
     
    isRaining = data(2,:) ~= 0 & ~isnan(data(2,:));
    idx = find(~[0 isRaining 0]);
    snz = diff(idx)-1;
    idxBegin = idx(snz>=nbMinConsecutive); % Indices de début des jours consécutifs de pluie
    idxSpan = snz(snz>=nbMinConsecutive); % Nombre de jours de pluie de ces mêmes groupes
    % Indices de tous les jours appartenant aux groupes
    idxConsecutiveRaining = cell2mat(arrayfun(@(beg,span) beg:beg+span-1, ...
                                     idxBegin, idxSpan, ...
                                     'UniformOutput', false));
    data(:,idxConsecutiveRaining)

  7. #7
    Membre confirmé
    Femme Profil pro
    Doctorant
    Inscrit en
    Mai 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 76
    Par défaut
    C'est super c'est exactement ce que je voulais,
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer l'indice CDD consecutive dry day
    Par ju_cayenne dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/10/2014, 21h12
  2. [CR 8.5] qui contactez quand on a une erreur inconnue ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 25/01/2006, 20h46
  3. [Struts]2 Threads identiques quand j'appelle une action
    Par seb55555 dans le forum Struts 1
    Réponses: 4
    Dernier message: 03/05/2005, 16h49
  4. Substitution de caractères quand on enfonce une touche
    Par Dionyzos dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/06/2004, 13h37
  5. Réponses: 2
    Dernier message: 23/03/2004, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo