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 :

convertir date 4D en date UTC [Python 3.X]


Sujet :

Python

  1. #1
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut convertir date 4D en date UTC
    Bonjour,
    j'ai un autre problème avec les dates sous 4D.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                if 'Beginning' in l:
                    Beginning = l[11:-13]
                    DateRDV = int (float((Beginning ))/1400) + 2
    Soit sous Excel :
    Beginning =61400640
    Date : 28.09.2016 08:00


    Merci pour votre aide,

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Ca serait mieux d'être un peu plus explicite sur le problème rencontré.
    De plus, s'il faut calculer le datetime Posix à partir d'une base de temps exotique, il suffit de prendre le temps de comprendre la réponse qui vous a été donnée (pour un cas similaire) et l'adapter.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    désolé mais je ne vois pas comment solutionner mon problème, je n'ai pas la connaissance requise.

    J'ai cherché des solutions, mais sans succès.

    Sur Excel, la formule que j'indique fonctionne, mais por passer un UTC, c'est pour moi du chinois !
    C'est un peu pour cette raison que je place un post.


    Merci de bien vouloir m'aider sur ce problème car je suis perdu.

    Meilleures salutations

    Guy Muller

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par Muller Guy Voir le message
    Sur Excel, la formule que j'indique fonctionne, mais pour passer un UTC, c'est pour moi du chinois !
    Sur Excel, la date 0 commence le 1 Janvier 1900 ou le premier Janvier 1904. Elle est représentée par un nombre flottant où la partie entière représente le nombre de jours écoulés et la partie décimale, heure, minute, secondes.
    Sur POSIX, c'est aussi un nombre flottant mais la partie entière représente le nombre de secondes écoulées depuis le 1er Janvier 1970.
    Donc si vous récupérez un nombre flottant depuis EXCEL, il y a un petit boulot de conversion à faire (qui vous a déjà été donné) pour l'exprimer à la sauce Posix (qui est autre chose que UTC).

    Maintenant, si vous écrivez que Beginning = 61400640 équivaut à Date : 28.09.2016 08:00. Alors là, désolé mais sous excel, 28.09.2016 08:00 est représenté par 42641,3333333333.
    61400640 est une date dans 160 000 ans qu'il ne sait même pas afficher correctement.
    note: et vous pouvez le vérifier par vous même en lançant Excel.

    Donc, je comprends que vous soyez très embêté avec de telles données mais on ne va pas s'assurer que vous avez bien récupéré un timestamp EXCEL: çà c'est votre boulot et on ne peut le faire à votre place (pour autant qu'on en ait envie car çà n'a aucun rapport avec la programmation Python).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    désolé, sous Excel c'est :
    Soit sous Excel :
    Beginning =61400640 / 1400
    43857.60
    Date : 28.09.2016 08:00

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par Muller Guy Voir le message
    désolé, sous Excel c'est :
    Soit sous Excel :
    Beginning =61400640 / 1400
    43857.60
    Date : 28.09.2016 08:00
    Mon EXCEL raconte autre chose, mais comme c'est un forum Python, inutile d'ergoter sur le sujet.

    Comme on vous a déjà donné une solution dans une réponse précédente, qu'avez vous fait pour l'adapter? Quel est le soucis rencontré? Avec Python, multiplier ou additionner, c'est pas si compliqué.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    Bonjour,
    Merci pour vos réponses, j’ai cherché à changer les paramètres mais cela ne donne rien de sérieux.
    Je tourne en boucle ?!?
    Merci d’avance pour votre aide, je désespère.

    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
     
    import datetime
     
    created_timestamp = 61400640 
     
    new_epoch = datetime.datetime(1900, 1, 1, 0, 0, 0)
    os_epoch = datetime.datetime.utcfromtimestamp(0) 
    epoch_delta = (os_epoch - new_epoch) 
     
     
    # fromtimestamp si la référence était en heure locale et dont la zone est identique à la machine exécutant le code
    dt = datetime.datetime.utcfromtimestamp(epoch_delta.total_seconds() + created_timestamp)
    # dt == datetime.datetime(2017, 10, 19, 10, 38, 6, 999993)
     
    print(dt.strftime("%Y/%m/%d %H:%M:%S"))
    Je devrais avoir # 28.09.2016 08:00 et j'ai 2041/12/11 15:44:00

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Ben, essayez une autre approche.

    Déjà je ne comprends pas pourquoi vous ne partez pas d'un datetime EXCEL i.e. date = 43857.60.
    Vous savez exprimer en nombre le 01/01/1970 depuis EXCEL soit offset ce nombre là.
    Donc le nombre de jours (et de pouièmes) depuis le 01/01/1970 sera date - offset.
    Pour obtenir le nombre de secondes, il faut multiplier par 3600*24 i.e. seconds = (date - offset) * 3600*24.
    Vous avez alors un nombre flottant que vous pouvez passer à datetime.fromtimestamp (ou fromutctimestamp) pour avoir la date et... lui appliquer .strftime("%Y/%m/%d %H:%M:%S").
    note: je viens de m'apercevoir que timedelta(days=...) accepte les nombre flottants. Ce qui simplifie beaucoup les choses puisqu'on peut écrire: datetime(1900, 1, 1) + timedelta(days=43857.60)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    Un grand merci pour votre aide, j'ai enfin réussi à traiter cette données.


    salutations GM

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Citation Envoyé par Muller Guy Voir le message
    Un grand merci pour votre aide, j'ai enfin réussi à traiter cette données.
    C'est bien... En tous cas, après avoir relu la documentation, le plus simple serait, sans doute, de procéder ainsi:
    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
    from datetime import datetime, timedelta
     
    _DEFAULT_BASETIME = datetime(1900,1,1)
    def dt2xl(number, base=_DEFAULT_BASETIME):
        return base + timedelta(days=number)
     
    _SECONDS_PER_DAY = 3600*24
    def xl2dt(dt, base=datetime(1900,1,1)):
        delta = dt - base
        return delta.days + delta.seconds/_SECONDS_PER_DAY
     
     
    if __name__ == '__main__':
     
        dt = datetime(2016, 9, 28, 8, 0)
        number = xl2dt(dt)
        print(number)
        dt2 = dt2xl(number)
        print(dt2)
        assert dt == dt2
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    Bonjour, j'ai choisi cette méthode :

    Merci pour vos conseils et votre patiente
    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
     
                if 'created_timestamp' in l:
                    created_timestamp = l[19:-21]
     
                    new_epoch = datetime.datetime(1990, 1, 1, 0, 0, 0)
                    os_epoch = datetime.datetime.utcfromtimestamp(0) 
                    epoch_delta = (new_epoch - os_epoch) 
     
                    dt = datetime.datetime.utcfromtimestamp(epoch_delta.total_seconds() + float(created_timestamp))
                    DateCreat = dt.strftime("%Y-%m-%d %H:%M:%S")
     
                if 'Beginning' in l:
                    Beginning = l[11:-13]
                    Date = float(Beginning)/1440
                    Delta = (Date-25569)*86400
     
                    dt = datetime.datetime.fromtimestamp(Delta)
                    DateRDV = dt.strftime("%Y-%m-%d %H:%M:%S")

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

Discussions similaires

  1. Convertir le format de date grégorienne à la date Hijri
    Par Boubou2020 dans le forum Développement
    Réponses: 1
    Dernier message: 21/10/2015, 11h37
  2. [delphi 2010] convertir une date locale future en UTC
    Par charlyoleg dans le forum Langage
    Réponses: 0
    Dernier message: 25/10/2013, 09h55
  3. [XL-2007] couleur cellule date differente si date passee, ou date du jour
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2011, 08h24
  4. [Firebird] Convertir une String en date
    Par laffreuxthomas dans le forum SQL
    Réponses: 1
    Dernier message: 04/05/2005, 19h42
  5. []Comment convertir une date GMT en date vb ?
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/08/2004, 16h01

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