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 :

Insérer des Dates dans un tableau


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Par défaut Insérer des Dates dans un tableau
    Bonjour à tous,

    Je m'arrache tous mes cheveux, donc je me tourne vers vous avant qu'il ne me reste plus rien...

    En entrée, j'ai un fichier texte avec une colonne correspondant à une date toutes les minutes et une autre correspondant à une hauteur. A la fin je cherche à obtenir un fichier texte avec une date toute les 30min et la hauteur qui y correspond.

    Le soucis c'est que j'ai des trous dans mes dates et il faut que j'insère la ligne correspondant à la date manquante et qui renvoie comme hauteur NaN.

    Pour que cela soit plus clair, je joins un exemple d'un "fichier brut" en entrée et d'un "fichier trie" que j'aimerai obtenir en sortie.

    fichierTrie.txt fichierBrut.txt

    J'ai commencé plusieurs script avec deux pistes de recherche:
    - un en convertissant les dates dans le calendrier julian (datenum) et en essayant de récupérer les dates toutes les 30 minutes mais le problème c'est que les secondes ne sont pas les mêmes toutes les minutes...
    - un autre en séparant les différentes colonnes de la date (Année,mois,jour,heure minute,seconde) et lire la colonne des minutes et ne récupérer que celle ou il y a 0 et 30, mais le soucis c'est que certaines dates ont bien la succession 0-30min mais pour des jours différents...

    Je ne vous cache pas que cela ne marche pas du tous, donc je me tourne vers vous si vous avez des idées pour m'aider...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    salut

    pour ton premier problème, regarde la fonction datevec
    elle te retourne les vecteurs année,mois, jour, heure, minutes et seconde
    tu peux ensuite reconstruire tes dates avec datenum en omettant les secondes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [vA, vM, vD, vH, vMN] = datevec(vMesDates);
    vMesDatesSansSecondes = datesnum(vA, vM, vD, vH, vMN, 0);
    ou alors tu peux aussi arrondir à la minute la plus proche
    (les dates sont exprimées en jours)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vMesDatesArrondiesA = round(vMesDates * 24 * 60) / 24 / 60
    ensuite pour mettre des nan là ou tu n'as pas d'information
    le plus simple est de d'abord créer un vecteur de nan puis de mettre les infos connues dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vDate = min(vMesDatesArrondiesA ):1/24/60:max(vMesDatesArrondiesA)
    vHauteursAvecNan = nan(size(vdate));
    vHauteur(vDate==vMesDatesSansSecondes) = vHauteurs;
    voila, ca c'est pour les idées
    après il faut faire attentions aussi aux comparaisons de floats

    Fabien

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Par défaut
    Salut

    Merci beaucoup le fab pour ta réponse.

    J'ai avancé dans mon script en m'inspirant de ce que tu m'as dit. J'ai essayé notamment de créer une matrice remplie que de NaN et de la compléter par les hauteurs connues. C'est sur derrière points que je bug un peu...

    J'ai la matrice "DMat" avec les dates et les hauteurs sous cette forme

    Yr Mn Day Hr Min Sec Hauteur
    2014 9 29 1 0 0 0,56960
    2014 9 29 1 30 0 0,5625
    2014 9 29 2 0 0 0,58990
    2014 9 29 2 30 0 0,5251
    2014 9 29 3 0 0 0,51430
    2014 9 29 3 30 0 0,5373
    2014 9 29 4 0 0 0,52990
    2014 9 29 4 30 0 0,5851
    2014 9 29 5 0 0 0,56230
    2014 9 29 9 30 0 0,7653
    2014 9 29 10 0 0 0,7769
    2014 9 29 10 30 0 0,717
    2014 9 29 11 0 0 0,7595
    2014 9 29 11 30 0 0,683
    2014 9 29 12 0 0 0,6879
    2014 9 29 12 30 0 0,678
    2014 9 29 13 0 0 0,6525
    2014 9 29 13 30 0 0,618


    J'ai voulu créer la matrice "NaN" qui prend en compte les sauts de dates (ici les heures manquantes entre 5h et 9h du 29/09/2014)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    % On choisit son fichier de données.
    fid=fopen('DateTest.txt','rt');
     
    C = textscan(fid,'%f %f %f %f %f %f %f', 'headerlines',1, 'delimiter','\n', 'CollectOutput',true)
     
    fclose(fid);
     
    DMat = C{1,1}; % Format matrice et non pas cell
     
    % Création de la matrice de toutes les dates avec que des NaN
    vDate = min(DMat):1/24/60:max(DMat)
    vHauteursAvecNan = nan(size(vDate));
    Est ce que tu peux m'expliquer la ligne que tu avais écrite dans ton dernier post stp?
    vDate = min(vMesDatesArrondiesA ):1/24/60:max(vMesDatesArrondiesA)
    Je pense que c'est cette ligne que j'ai du mal interpréter... Sinon ça veut dire que je suis complètement à côté de la plaque...

    En tous cas, merci pour l'attention que tu portes à mon problème

  4. #4
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    Citation Envoyé par alciade Voir le message
    Est ce que tu peux m'expliquer la ligne que tu avais écrite dans ton dernier post stp?

    Je pense que c'est cette ligne que j'ai du mal interpréter... Sinon ça veut dire que je suis complètement à côté de la plaque...

    En tous cas, merci pour l'attention que tu portes à mon problème
    en gros je créé dans cette ligne toutes les dates de la date minimale de ton jeux de donnée (min(vMesDatesArrondiesA )) à la date maximale de ton jeux de donnée (max(vMesDatesArrondiesA )) sur un pas de 1 minute (les date étant en jour, cela donne 1/24/60)
    la notation a:b:c créer un vecteur ligne de pas b allant de a à c

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Par défaut
    Ok, je comprend mieux je me doutais que c'était le pas de temps de 1 minute, mais par contre je ne comprend pas pourquoi tu fais un vecteur ligne et non pas un vecteur colonne des dates comprises entre min(vMesDates) et max(vMesDates) pour le comparer avec le tableau de vMesDatesSansSecondes (qui un vecteur colonne)?

    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
    X = textscan(fid, '%s %f','delimiter', '\t');
     
    fclose(fid);
     
    vMesDates = char(X{1});
    vHauteurs = X{2};
     
    [vA, vM, vD, vH, vMN] = datevec(vMesDates);
    vMesDatesSansSecondes = datenum(vA, vM, vD, vH, vMN, 0);
     
    %vMesDatesArrondiesA = round(char(vMesDates) * 24 * 60) / 24 / 60;
     
    vDate = [min(vMesDates):30/60/24:max(vMesDates)];
    vHauteursAvecNan = nan(size(vDate));
    vHauteur(vDate==vMesDatesSansSecondes) = vHauteurs;
    Lorsque je lance le script ci-dessus il m'affiche un message d'erreur sur la ligne 15 en me disant que les dimensions de mes deux matrices ne sont pas compatibles (Error using == , Matrix dimensions must agree.).

    J'ai essayé de faire un vecteur colonne des dates comprises entre le minimum et le maximum de mes données mais j'avoue ne pas trop connaître l'écriture qu'il faut adopter...

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    Citation Envoyé par alciade Voir le message
    Ok, je comprend mieux je me doutais que c'était le pas de temps de 1 minute, mais par contre je ne comprend pas pourquoi tu fais un vecteur ligne et non pas un vecteur colonne des dates comprises entre min(vMesDates) et max(vMesDates) pour le comparer avec le tableau de vMesDatesSansSecondes (qui un vecteur colonne)?
    parce que ça n'a pas vraiment d'importance dans ce cas
    cependant tu as raison, c'est plus propre qu'ils soient tous les deux en colonnes ou en ligne

    Citation Envoyé par alciade Voir le message
    Lorsque je lance le script ci-dessus il m'affiche un message d'erreur sur la ligne 15 en me disant que les dimensions de mes deux matrices ne sont pas compatibles (Error using == , Matrix dimensions must agree.).
    oui la c'est un peu de ma faute, j'ai été un peu rapide
    le == ne passe pas entre ceux vecteurs de taille (et non d'orientation!) différentes
    là il faut plutôt utiliser ismember par exemple (ou une boucle for ou une fonction de type arrayfun)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idxDatesConnues = ismember(vDates,vMesDatesSansSecondes);
    vHauteur(idxDatesConnues ) = vHauteurs;
    je te laisse regarder la FAQ sur le principe d'indexage
    mais attention à la comparaisons de nombres à virgules flottantes !!

    Citation Envoyé par alciade Voir le message
    J'ai essayé de faire un vecteur colonne des dates comprises entre le minimum et le maximum de mes données mais j'avoue ne pas trop connaître l'écriture qu'il faut adopter...
    comme ca (je te laisse regarder la doc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vecteurColonne = vecteurLigne.';
    vecteurColonne =vecteurLigne(:);

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

Discussions similaires

  1. Insérer des valeurs dans un tableau
    Par bassiste dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 08/12/2008, 13h44
  2. Insérer des QSpinBox dans un tableau
    Par peuf23 dans le forum Débuter
    Réponses: 8
    Dernier message: 30/09/2008, 19h11
  3. Insérer des cellules dans un tableau
    Par BkD35 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/12/2007, 22h00
  4. insérer des données dans un tableau lors d'une boucle
    Par sissi25 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/05/2007, 09h19
  5. Réponses: 9
    Dernier message: 19/02/2007, 20h33

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