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 :

Boucle matlab pour les dates : problème de format


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut Boucle matlab pour les dates : problème de format
    Bonjour à tous, je souhaite mettre une date de fin, une date d'arrivé et que ça augmente de 1 jours à chaque fois.

    Bon ça fonctionne, le problème c'est que j'aimerais retrouver un formart du même type c'est à dire : yyyy-mm-dd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    start_date = 20131213; %Date de départ 
    end_date = 20141215; %Date de fin 
    formatOut = 'yyyy/mm/dd'; %Format de la date 
    hr_step=datenum(0,0,1,0,0,0); %Nombre de jours à augmenter 
    date_array=datenum(start_date):hr_step:datenum(end_date);  %Pour écrire toutes les dates entres les deux 
    cellstr(datestr(date_array,formatOut,'local')) %sépare les cellules et ressort les dates
    Le problème c'est qu'en output matlab me donne :

    Pour les 3 dernières

    5144/10/07'
    '5144/10/08'
    '5144/10/09'

    Au lieu de :

    20141213
    20141214
    20141215

    Ou même d'un format yyyy-mm-dd ou yyy/mm/dd

    Merci pour votre aide

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    L'entier 20131213 n'est pas la date que tu penses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    start_date= datenum('2013/12/13','yyyy/mm/dd'); % ceci est la représentation en entier de la date que tu cherches
    une fois que tu as des entier, pour les incrémenter de 1, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dts= datenum('2013/12/13','yyyy/mm/dd') : 1 : datenum('2014/12/13','yyyy/mm/dd');
    datestr(dts)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse,

    Le problème c'est que j'ai plein de fichier qui on comme nom les dates yyyymmdd, je souhaite ouvrir dans matlab les fichiers compris entre la date de départ et d'arrivée.

    Donc (pour date_array), je veux faire une liste de date entre une date de départ et une date d'arrivé.

    Ensuite faire une boucle pour lui dire d'aller chercher pour chaque date, le fichier portant le nom de la date stockée (dans date_array) et l'ouvrir dans matlab.

    Donc je dois garder le format yyyymmdd et ajouter 1 jours à chaque fois.

    Ce n'est pas possible ?

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    NB: j'ai modifié mon post précédent avant ta réponse.

    Tu peux très bien travailler avec ce format, mais en tant que chaines de caractères et non pas d'entiers. il faut les convertir en entier via datenum, incrémenter, et repasser en chaines de caractères, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dts= datenum('20131213','yyyymmdd') : 1 : datenum('20141213','yyyymmdd');
    datestr(dts,'yyyymmdd');
    % NB j'ai changé le format depuis l'exemple précédent

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Parfait merci beaucoup ça fonctionne parfaitement.

    J'aurais besoin d'une petite astuce car je galère sur ça depuis un moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    clear all 
    delimiterIn = '@'; %Delimiteur des séries d'exposition 
    start_date = '20131213'; %Utilisateur entre la date de début de la série 
    end_date = '20141213'; %Entre la date de fin 
    dts= datenum(start_date,'yyyymmdd') : 1 : datenum(end_date,'yyyymmdd'); %Converti les séries en date 
    nom_fichier= datestr(dts,'yyyymmdd'); %Repasse les séries en string 
    
    for i = 1:numel(nom_fichier) %Nombre de jours dans la liste nom_fichier 
    date_expos_fichier_selectionne=nom_fichier(i,:); %Stock le nom du fichier pour la date 
    chemin_fichier_ouvrir=fullfile(repertoire_daughter_unziped_files,date_expos_fichier_selectionne); %Chemin du fichier ayant le nom de la date 
    date_expos_fichier_selectionne = importdata(chemin_fichier_ouvrir, delimiterIn); %Ouvre le fichier ayant la date selectionnée 
    end
    Le problème vient de la ligne en gras, en effet, je souhaite que lorsque le fichier s'ouvre dans matlab il porte le nom de la date contenu dans 'date_expos_fichier_selectionne" le problème c'est que ça ne fonctionne pas.

    Une idée? merci d'avance

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Qu'est ce qui ne fonctionne pas ? Une erreur, un résultat bizarre ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Comme attendu c'est au niveau du nom.

    Comme le nom de la variable : date_expos_fichier_selectionne

    change à chaque pas de la boucle, je me retrouve à la fin avec date_expos_fichier_selectionne = 20141213 la dernière date.

    Alors que je voudrais qu'a chaque pas de la boucle, matlab ouvre le fichier avec comme nom la valeur de la cellule "date_expos_fichier_selectionne". En somme, je souhaiterais avoir un fichier par date et que ce derniers ai comme nom la date.

    je ne sais pas si je suis clair.

  8. #8
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Deja, nom_fichier est un cell-array à une dimension, et le i-ème élement s'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    date_expos_fichier_selectionne=nom_fichier{i};
    % et non pas
    % date_expos_fichier_selectionne=nom_fichier(i,:);
    Ensuite, tu charges le contenu dans la variable date_expos_fichier_selectionne, mais à chaque itération de la boucle, tu effaces la valeur précédente. Tu peux par exemple les stocker dans un gros cell-array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    loaded_datas= {};
    for i = 1:numel(nom_fichier) %Nombre de jours dans la liste nom_fichier 
    date_expos_fichier_selectionne=nom_fichier(i,:); %Stock le nom du fichier pour la date 
    chemin_fichier_ouvrir=fullfile(repertoire_daughter_unziped_files,date_expos_fichier_selectionne); %Chemin du fichier ayant le nom de la date 
    date_expos_fichier_selectionne = importdata(chemin_fichier_ouvrir, delimiterIn); %Ouvre le fichier ayant la date selectionnée 
    loaded_datas{i} = date_expos_fichier_selectionne;
    end
    Ensuite, pour accéder au contenu du n-eme fichier, utilise loaded_datas{n}.
    Par contre si les fichiers sont volumineux, il vaut mieux les traiter au fur et à mesure (dans la boucle) plutot que de tout conserver en mémoire.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je comprend pas trop ton loaded_datas = {} il stock quoi ?

    Car là comme ça, ça ne fonctionne pas.

    j'ai dates_expos_fichier_selectionne qui vaut 2
    et j'ai pas de fichier qui s'appellent : 20131212 .... etc

    Je sais pas trop si je suis assez clair sur ce que je souhaites faire.

    Je souhaites que chaque fichier chargé est le nom de la date_expos_fichier_selectionne qui lui correspond.
    Cette même date qui sert dans le chemin à trouver le fichier.

    Merci pour votre aide

  10. #10
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    loaded_data stocke le contenu des fichiers.

    20131212 n'est pas un nom de variable valide en matlab. Tu peux:
    - Soit utiliser loaded_data et un autre cell loaded_names contenant les noms de fichiers
    - Soit tout mettre dans une structure du genre x.data_20131212 = ... etc

    et j'ai pas de fichier qui s'appellent : 20131212
    Il faut peut être vérifier l'existence du fichier avant de faire importdata non ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    En fait le problème vient pas de ce que tu m'as donnée mais d'avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    delimiterIn = '@'; %Delimiteur des séries d'exposition 
    start_date = '20131213'; %Utilisateur entre la date de début de la série 
    end_date = '20131215'; %Entre la date de fin 
    dts= datenum(start_date,'yyyymmdd') : 1 : datenum(end_date,'yyyymmdd'); %Converti les séries en date 
    nom_fichier= datestr(dts,'yyyymmdd'); %Repasse les séries en string 
     
    loaded_datas= {};
    for i = 1:numel(nom_fichier) %Nombre de jours dans la liste nom_fichier 
    date_expos_fichier_selectionne=nom_fichier(i); %Stock le nom du fichier pour la date 
    chemin_fichier_ouvrir=fullfile(repertoire_daughter_unziped_files,date_expos_fichier_selectionne); %Chemin du fichier ayant le nom de la date 
    date_expos_fichier_selectionne = importdata(chemin_fichier_ouvrir, delimiterIn); %Ouvre le fichier ayant la date sélectionnée 
    loaded_datas{i} = date_expos_fichier_selectionne;
    end
    J'ai cette erreur :
    Error using importdata (line 136)
    Unable to open file.

    Pourtant les fichiers existent bien.

    Edit cette erreur venait de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_expos_fichier_selectionne=nom_fichier(i);
    quand je mets ça la valeur est 2
    quand je mets :
    date_expos_fichier_selectionne=nom_fichier(i, : );
    la valeur qui ressort est 20131213

    Par contre ça tourne un moment et j'ai cette erreur :

    Index exceeds matrix dimensions.

  12. #12
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    oui, autant pour moi, datestr renvoie une matrice de charactère et non un cell de strings.
    L'erreur de dimension vient de numel. Il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i = 1:size(nom_fichier,1) % Nombre de jours dans la liste nom_fichier 
    date_expos_fichier_selectionne=nom_fichier(i,:);
    ...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Parfait, plus d'erreur !

    Par contre j'ai toujours pas de fichier avec le nom de la date. J'ai la variable "date_expos_fichier_selectionne" qui contient les donnés importés par le derniers pas de la boucle (en gros qui à importé le fichier "20131215").

    En fait on est d'accord quand je mets :

    date_expos_fichier_selectionne = importdata(chemin_fichier_ouvrir, delimiterIn);

    Il importe le fichier et lui donne le nom "date_expos_fichier_selectionne " ?

    Moi je souhaite qui lui donne comme nom, la valeur de "date_expos_fichier_selectionne " (20131215 par exemple)

  14. #14
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Il importe le fichier et lui donne le nom "date_expos_fichier_selectionne " ?
    oui
    Moi je souhaite qui lui donne comme nom, la valeur de "date_expos_fichier_selectionne " (20131215 par exemple)
    tu ne peux pas, ce n'est pas un nom valide pour une variable en matlab; voir mon post de 14h05

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par VV33D Voir le message
    loaded_data stocke le contenu des fichiers.

    20131212 n'est pas un nom de variable valide en matlab. Tu peux:
    - Soit utiliser loaded_data et un autre cell loaded_names contenant les noms de fichiers
    - Soit tout mettre dans une structure du genre x.data_20131212 = ... etc


    Il faut peut être vérifier l'existence du fichier avant de faire importdata non ?
    Pardon, j'avais pas vu.

    Je peux donc lui dire de nommer x.data_20131212 ? je suis désolé je ne sais pas faire

    si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x.data_'date_expos_fichier_selectionne'  = importdata(chemin_fichier_ouvrir, delimiterIn);
    J'imagine que ça ne fonctionnera pas

    Edit : Je confirme.

  16. #16
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    x=[];
    for...
    x.(['data_' date_expos_fichier_selectionne])  = importdata(...)
    ...end
    Mais je pense que la version avec deux cells est préférable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATAS={};
    NAMES={};
    for i= ...
    NAMES{i}= nom_fichier(i,:);
    DATAS{i} = importdata(...);
    ...end
    Pour n entre 1 et length(DATAS) DATAS{i} est le contenu du fichier dont le nom est NAMES{i}

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Genial tout tourne au poil !

    Merci infiniment pour ton aide !!!!

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 200
    Points : 46
    Points
    46
    Par défaut
    Je me permets de revenir demande un peu d'aide


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for j = 1:size(nom_fichier,1) %Nombre de dates 
    for i = 1:numel(Exposition.([Type_dossier nom_fichier(j,:)]).textdata(:,5)) %Nombres de ligne de la 5ème colonne des données 
        if strcmp('GLOBAL',Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,5)) ~= 0; %Si la ieme ligne de la 5ème colonne des données et égale "Global' 
     
           var1(i,:) = Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,4);
           var2(i,:) = Exposition.([Type_dossier nom_fichier(j,:)]).data(i,1);
           var3(i,:) = Exposition.([Type_dossier nom_fichier(j,:)]).data(i,2);
     
    %Alors le fichier renvoi la 4ème colonne du fichier text de la date considérée, la 1ème colonne et la 2ème du fichier data des mêmes données et renvoi uniquement les valeurs pour i où la valeur est égale à globale 
     
             Exposition2.([Type_dossier nom_fichier(j,:)])(i,:) = [var1(i) var2(i) var(i) ];
        end
    end
    end
    Vous avez une idée de l'erreur ??

    Je crois que ça vient de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if strcmp('GLOBAL',Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,5));
    Là je veux que si la valeur dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exposition.([Type_dossier nom_fichier(j,:)]).textdata(i,5));
    est égale à Global alors on réalise l'opération. Sinon rien. Le problème je crois que ça me renvoie 0 quand c'est faux.

    ça ne me mets pas d'erreur par contre ça me donne une matrice mais elle est rempli n'importe comment, ça mets des 0 partout , il y'a quelques lignes avec des valeurs mais des [] partout, les valeurs correspondent pas aux lignes que j'importe ... je vois pas pourquoi ça me semblait bon.
    Merci pour votre aide

Discussions similaires

  1. [XL-2007] Format texte pour les dates est erroné
    Par Tomeloale dans le forum Excel
    Réponses: 3
    Dernier message: 19/02/2014, 10h32
  2. Requêtes SQL pour les Dates et numériques
    Par Ramage03 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2006, 17h26
  3. Filtre pour les dates
    Par aliwassem dans le forum Bases de données
    Réponses: 11
    Dernier message: 21/02/2006, 11h48
  4. implanter des calendriers pour les dates
    Par student007 dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 19h24
  5. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

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