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

Fortran Discussion :

Convertir une série de dates en pas de temps


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Convertir une série de dates en pas de temps
    Bonjour,

    Je dispose d'un fichier de données (mesures) comprenant une série de dates, rangées en colonnes, et qui se présentent sous la forme yy.mm.dd hh:mm:ss (année, mois, jour, heure, minute, seconde). Par ailleurs, ces dates ne sont pas régulièrement espacées.

    J'aimerais convertir cette série de dates en une série de pas de temps (en h) afin de pouvoir par la suite traiter mes données.

    Le problème est que mes mesures s'étalent sur plusieurs années, si bien que je rencontre de nombreux problèmes notamment en ce qui concerne les changements de jour, de mois (certains ont 30 jours, d'autres 31, et le cas de février...), et d'année (il faut faire attention aux années bissextiles).

    Voici, à titre indicatif, un extrait qui montre comment sont données mes dates :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           DATE     
     2007.01.21 09:00:02      	    	     	     	 	 
     2007.01.21 09:15:02 	        
     2007.01.21 09:30:02 	        
     2007.01.21 09:40:02 
     ...
    et je voudrais obtenir quelque chose du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     0.00
     0.25
     0.50
     0.66
     ...
    Comment procéder ? Quelqu'un a-t-il une idée ?

    Merci de votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    La solution classique est de convertir la date en date Julien par la fonction suivante :
    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
    FUNCTION jd(yyyy, mm, dd) RESULT(ival)
     
    INTEGER, INTENT(IN)  :: yyyy
    INTEGER, INTENT(IN)  :: mm
    INTEGER, INTENT(IN)  :: dd
    INTEGER              :: ival
     
    !              DATE ROUTINE JD(YYYY, MM, DD) CONVERTS CALENDER DATE TO
    !              JULIAN DATE.  SEE CACM 1968 11(10):657, LETTER TO THE
    !              EDITOR BY HENRY F. FLIEGEL AND THOMAS C. VAN FLANDERN.
    !    EXAMPLE JD(1970, 1, 1) = 2440588
     
    ival = dd - 32075 + 1461*(yyyy+4800+(mm-14)/12)/4 +  &
           367*(mm-2-((mm-14)/12)*12)/12 - 3*((yyyy+4900+(mm-14)/12)/100)/4
     
    RETURN
    END FUNCTION jd
    Pour ton problème, il faudrait donc convertir le résultat en double, et ajouter h/24 + m/24/60 + s/24/60/60, soit :
    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
    FUNCTION jd(yyyy, mm, dd, Heures, Minutes, Secondes) RESULT(ival)
     
    INTEGER, INTENT(IN)  :: yyyy
    INTEGER, INTENT(IN)  :: mm
    INTEGER, INTENT(IN)  :: dd
    INTEGER, INTENT(IN)  :: Heures
    INTEGER, INTENT(IN)  :: Minutes
    INTEGER, INTENT(IN)  :: Secondes
    double precision         :: ival
     
    !              DATE ROUTINE JD(YYYY, MM, DD) CONVERTS CALENDER DATE TO
    !              JULIAN DATE.  SEE CACM 1968 11(10):657, LETTER TO THE
    !              EDITOR BY HENRY F. FLIEGEL AND THOMAS C. VAN FLANDERN.
    !    EXAMPLE JD(1970, 1, 1) = 2440588
     
    ival = dd - 32075 + 1461*(yyyy+4800+(mm-14)/12)/4 +  &
           367*(mm-2-((mm-14)/12)*12)/12 - 3*((yyyy+4900+(mm-14)/12)/100)/4 &
          + (Heures + (Minutes + Secondes / 60.) / 60.) / 24.
     
    RETURN
    END FUNCTION jd

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci de ta réponse Sylvain, c'est vraiment intéressant.

    J'ai testé ta méthode de conversion avec quelques dates, et ça a l'air de bien marcher. Après avoir fait en sorte que l'origine des temps corresponde à ma première date, ma routine donne les résultats suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      0.000000000000000E+000
      1.041666651144624E-002
      2.083333302289248E-002
    Mais, ne sachant pas en quelle unité s'expriment ces valeurs, je n'arrive pas à repasser en heures ...

    Comment faire ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Unité : jour

    1.041666651144624E-002 jours = 0,25 heures

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup, j'ai bien mes résultats en heures à présent.

    Maintenant, il ne me reste plus qu'à récupérer mes dates qui sont sous la forme yy.mm.dd hh:mm:ss dans mon fichier pour les donner à mon programme de conversion.

    Pour ce faire, j'ai remplacé les . et les : présents dans les dates par des espaces, car les autres données de mon fichier sont rangées en colonnes et séparées par des espaces.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       DATE                          VALUES
     2007.01.21 09:00:02             125.36666	     	     	 	 
     2007.01.21 09:15:02             1454.3254  
     2007.01.21 09:30:02             522.3000   
     2007.01.21 09:40:02             187.724
     ...                             ...
    De plus, Fortran permet de traiter facilement les données séparées par des espaces. Mais cette solution n'est guère satisfaisante.

    L'idéal serait de changer de séparateur, ou préciser un format spécifique pour les deux premières colonnes (i.e celles qui contiennent les dates) seulement.

    Est-ce possible ?

    Merci

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Points : 63
    Points
    63
    Par défaut
    Regarde la réponse pour "Format 77".

    Une solution est de lire toute la ligne dans une chaine de caractères, remplacer les points (doubles points) par des espaces, et faire une lecture interne.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci de ta réponse mipicard.

    J'ai fait ce que tu m'as dit, et ça marche ...

    En fait, c'est la technique de la chaîne de caractères intermédiaire que Sylvain m'avait déjà suggérée dans une autre discussion.

    Encore merci et à bientôt.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 58
    Points : 49
    Points
    49
    Par défaut
    Il existe une librairie de mécanique spaciale mslib faite par le CNES qui permet de faire cela facilement

    elle est un format libre elle s'appelle mslib.

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

Discussions similaires

  1. Convertir une string en date.
    Par Empty_body dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/11/2006, 21h56
  2. convertir une chaine en date
    Par imane_bennouna dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2006, 19h58
  3. [vba] convertir une string en date
    Par megapacman dans le forum Access
    Réponses: 1
    Dernier message: 11/09/2006, 15h46
  4. Convertir une chaîne en date
    Par davinout dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2006, 19h35
  5. [Firebird] Convertir une String en date
    Par laffreuxthomas dans le forum SQL
    Réponses: 1
    Dernier message: 04/05/2005, 19h42

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