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

Python Discussion :

convertion d'une date format serie


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 19
    Par défaut convertion d'une date format serie
    Bonjour,

    mon premier pb bloquant,

    j'extrait d'une base (en fichier binaire) des enregistrement la date et sour la forme d'un float je croix(8 octets).
    la donnée est la suivante : 39767.397916666669
    je sait de source sur que cette valeur représente une date dont sa "valeur" est : 15/11/08 9:33 dont j'en suis aussi sur merci excel (arrondi à 39767.39792).

    Comment en python convertir ce nombre en date ?

  2. #2
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 19
    Par défaut
    Comme quoi en cherchant mieux,

    D' abord sur 39767.397916666669, 39767 correspond à la date 15/11/2008, retrouvé avec la fonction datetime.

    Ensuite le reste 0.397916666669 correspond à une heure ou 0 = 0 et 23h59h59 = 0,999999999999.

    cela doit correspondre à 10h33 heure TU donc 9:33 local je pense.

    Je posterai mon bout de code bientôt dés que j'aurai trouvé la fonction pour les HMS.

    A+

  3. #3
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 19
    Par défaut
    je coince sur des convertions de type de données

    Voila, dans l'extrait de mon code ci-joint,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    import datetime
    import math
     
    f = open('G:\Projet_dev\test.bin' , 'rb')
    date = f.read(8)
    my_date = unpack('d', date) #Float
    ma_date = math.trunc(my_date)
    d0 = datetime.date(1900, 1, 1)
    delta = datetime.timedelta(days=(ma_date -2.))
    d1 = d0 + delta
    print "Date = ", d1
    j'ai l'erreur suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ma_date = math.trunc(my_date)
    AttributeError: __trunc__
    j'ai trouvé nul part un explication sur cet attribut __trunc__

    A ce momment, ma_date=39767.397916666669 et j'utilise math.trunc pour recupérer un int égal 39767 car la fonction datetime ne prend pas les float.


    voila le pb avant de chercher pour le calcul des heures et minutes avec le reste du float (0.397916666669).

    Cordialement

  4. #4
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Par défaut
    Tu utilises unpack du module struct ?

    Cette méthode retourne toujours un tuple :
    struct.unpack(fmt, string)
    Unpack the string (presumably packed by pack(fmt, ...)) according to the given format. The result is a tuple even if it contains exactly one item.
    Et la méthode trunc du module math ne fonctionne qu'avec des réels en paramètre :
    math.trunc(x)
    Return the Real value x truncated to an Integral
    Tu lui passes un tuple, c'est donc normal que la méthode lève une exception. Les tuples ne possèdent pas de méthode __trunc__.


    Sinon pour revenir au premier post, ça me paraît assez étrange que tu obtiennes une date sous forme de réel étant donné que les dates sont des données discrètes.
    Les dates sont souvent codées par un entier signé (32 ou 64bits) selon la norme POSIX [1][2].

    [1] http://en.wikipedia.org/wiki/Unix_ti...ing_the_number
    [2] http://en.wikipedia.org/wiki/Time_t

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print 'int(39767.397916666669) =',int(x)
    Résultat
    int(39767.397916666669) = 39767
    EDIT: j'ai effacé des solutions trouvées en allant chercher midi à 14h37

  6. #6
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Le plus dur à été de trouvé en quel format étais exprimé ta date

    D'après ce que j'ai trouvé, c'est un format microsoft OLE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #-*- coding: utf-8 -*- 
     
    import datetime
     
    OLE_BASE_TIME = datetime.datetime(1899, 12, 30, 0, 0, 0)
     
    def ole2datetime(dt):
        return OLE_BASE_TIME + datetime.timedelta(days=float(dt))
     
     
     
    d = 39767.397916666669
     
    print ole2datetime(d)
    A vérifier avec d'autres dates avant de valider la solution.

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on compare avec le comptage des dates chez Python, on constate quelques bizarreries dans le comptage des dates chez Microsoft. Par exemple dans Excel:

    - la base du comptage n'est pas le 1/1/1900 comme on le voit souvent, mais le 31/12/1899 (le 1/1/1900 a le nombre "1").

    - l'année 1900 est considérée comme bissextile, alors qu'elle ne l'est pas (divisible par 100, mais pas par 400). D'ailleurs, on peut rentrer dans Excel le 29/2/1900 alors que cette date n'existe pas.

    Ce qui fait qu'après le 1/3/1900, on peut faire coïncider le comptage Python avec celui d'Excel en se basant sur le 30/12/1899.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from datetime import date, timedelta
     
    d1 = date(1899, 12, 30)
    d2 = date(2008, 11, 15)
    print d2 - d1
    39767
     
    nbj = timedelta(39767)
    print d1 + nbj
    2008-11-15
    Cependant, il semble y avoir des différences avec VBA: voir les explications de Microsoft (que je ne trouve pas limpides...): http://support.microsoft.com/kb/466618/fr.

    Tyrtamos

  8. #8
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 19
    Par défaut
    Merci à tous,

    la solution de DelphiManiac me satisfait amplement et fait en plus l'heure.
    Que cela est simple quand on a la solution sous les yeux

    effectivement, déjà au départ avec l'utilisation de "unpack", je ne récupérai pas ma valeur car pas d'index donc,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my_date = unpack('d', date) #Float
    ma_date = my_date[0]
    Merci à tous, pb résolu pour moi

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

Discussions similaires

  1. [MySQL] récupérer une date formatée avec MySql
    Par stolx_10 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/06/2007, 10h57
  2. Réponses: 5
    Dernier message: 20/02/2007, 17h52
  3. [MySQL] Faire un INSERT d'une date format Francais dans un champ date '0000-00-00' ?
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/11/2006, 13h49
  4. [VBA-E]convertion d'une date
    Par watcha69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/02/2006, 13h09
  5. [date et heure] convertion d'une date en chaîne
    Par jean-jacques varvenne dans le forum SQL
    Réponses: 5
    Dernier message: 23/03/2005, 11h31

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