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 :

Conversion seconde format y+m+d+h+m+s


Sujet :

Python

  1. #1
    Membre régulier Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Points : 116
    Points
    116
    Par défaut Conversion seconde format y+m+d+h+m+s
    Salut, comme beaucoup de posteur sur ce forum, je débute en Python, et après quelques heures passé sur un exercices, je n'arrive toujours pas à le résoudre.
    Comment faire un programme pouvant convertir un nombre de secondes données au format
    année, mois, jour, heures,minutes et secondes.
    Exemple temps en secondes: 139135360
    Résultat final: 1an 3 mois 10jours 4heures et 30 secondes.
    Même en connaissant les base de la conversion, c'est pas toujours facile, et l'on sembrouille assez rapidement. (Lorsque l'on débute)
    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    salut,

    je pense que le mieux serait que tu postes ton bout de code


  3. #3
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Un code (à la va-vite) - c'est facile d'automatiser la chose. Par contre, j'ai pris un mois=30 jours et une annee=365 jour (donc si ton nombre vient d'une différence intiale de 2 dates, c'est pas la méthode à prendre). Regarde alors le module datetime et les objets datetime et timedelta

    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
    22
    23
    a=139135360
     
    second = 1
    minute = 60*second
    heure = 60*minute
    jour = 24*heure
    mois = 30*jour
    annee = 365*jour
     
    annees = a/annee
    rest = a - annees*annee
    moiss = rest/mois
    rest = rest-mois*moiss
    jours = rest/jour
    rest = rest-jour*jours
    heures = rest/heure
    rest = rest-heure*heures
    minutes = rest/minute
    rest = rest-minute*minutes
    seconds = rest
     
    print annees, moiss, jours, heures, minutes, seconds
    print annees*annee+moiss*mois+jours*jour+heures*heure+minutes*minute+seconds
    resultat:
    4 5 0 8 42 40
    139135360
    (bon, c'est pas le résultat que tu nous a donné)

    Sous forme condensé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    rest=139135360
     
    conv = (31536000,2592000,86400,3600,60,1)
    result = [0,0,0,0,0,0]
    i=0
     
    while rest>0:
        result[i]= rest/conv[i]
        rest=rest-result[i]*conv[i]
        i+=1
     
    print result

  4. #4
    Membre régulier Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Points : 116
    Points
    116
    Par défaut
    Merci beaucoup, la réponse à été rapide, et on ne jette pas les débutants comme sur pas mal de forum
    Effectivement, on m'avai conseillé d'utiliser un modulo.(je vien de omprendre ce que c'est)
    Je trouve que ta façon de procédé est un peu longue, mais simple.
    Je vais me baser dessus, commenter chaque étape(pour mieu le comprendre), et pourquoi pas le modifier pour en faire une petite application.
    Avec un INPUT pour a.

    PS:edite ton lien X_x, tu a mal tapé le "http://" il manque le "h"
    re merci

  5. #5
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    (lien corrigé)
    Avec la fonction divmod (qui renvoit le quotient et le modulo), c'est encore plus condensé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rest=139135360 
     
    conv = (31536000,2592000,86400,3600,60,1) 
    result = [0,0,0,0,0,0] 
    i=0 
     
    while rest>0: 
        result[i], rest = divmod(rest,conv[i] )
        i+=1 
     
    print result

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ou alors beaucoup plus simple : gmtime.

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par loufoque
    Ou alors beaucoup plus simple : gmtime.
    time.gmtime() renvoit une date et non une durée.
    on pourrait se débrouiller avec les objets datetime et timestamp pour calculer l'écart entre 2 dates mais on resterait bloqué à des jours et des secondes (logique vu qu'un mois n'est pas défini de manière unique). Donc je pense que si l'on veut une réponse avec des années, mois à partir d'une durée, on n'a pas le choix.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    N'empêche que toutes les données de la date correspondent bien sauf l'année qui a 1970 de trop.
    D'autant plus que ça prendra en compte que les mois ont chacun un nombre de jours différents et aussi pour les années mais en fait tout ça dépend de quel moment on part.

    time.gmtime(139135360)
    -> (1974, 5, 30, 8, 42, 40, 3, 150, 0)

    4 ans, 5 mois, 30 jours, 8 heures, 42 minutes et 40 secondes

  9. #9
    Membre régulier Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Points : 116
    Points
    116
    Par défaut
    Voilà ce que ca me donne, tous fonctionne parfaitement sauf le nombres de jours (nul) alors que loufoque en a trouvé 30

    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
    22
    #Convertisseur seconde au format y+m+d+h+m+s
    a=139135360					      #nombre de secondes données à convertir
    second = 1                      #choix de l'unité de conversion: 1seconde=1
    minute = 60*second			     #1mininute=60secondes
    heure = 60*minute			      #1heure=60minutes
    jour = 24*heure					  #1jour=24heures
    mois = 30*jour					   #1mois=30jours
    annee = 365*jour			       #1an=365jours (ici je ne prend pas en compte les années bissextiles)
     
    annees = a/annee				
    rest = a - annees*annee				
    moiss = rest/mois
    rest = rest-mois*moiss
    jours = rest/jour
    rest = rest-jour*jours
    heures = rest/heure
    rest = rest-heure*heures
    minutes = rest/minute
    rest = rest-minute*minutes
    seconds = rest
     
    print a,"secondes donne:",annees,"an(s)", moiss,"mois", jours,"jour(s)", heures, "heure(s)", minutes,"minute(s)", "et", seconds, "seconde(s)"
    Sinon, comment laisser le choix du nombres de secondes "a" lors de l'execution du programme svp?
    Jai essayer avec ça en première ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = input('entrez le nombre de secondes à convertir (valeur numérique) : ')
    Mais, ce n'est pas très convaiquant.
    dur les début

  10. #10
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par loufoque
    N'empêche que toutes les données de la date correspondent bien sauf l'année qui a 1970 de trop.
    D'autant plus que ça prendra en compte que les mois ont chacun un nombre de jours différents et aussi pour les années mais en fait tout ça dépend de quel moment on part.

    time.gmtime(139135360)
    -> (1974, 5, 30, 8, 42, 40, 3, 150, 0)

    4 ans, 5 mois, 30 jours, 8 heures, 42 minutes et 40 secondes
    sauf que normalement il faut trouver 0 jour (et non 30) - du moins quelquechose proche de 0
    car time.gmtime(0) = (1974,1,1,0,...). Donc il fallait penser au moins à enlever 1 au mois et 1 au jour... Donc on aurait trouvé 4ans, 4 mois, 29 jours ...
    Et finalement c'est tout à fait logique. On parle de durée indépendante de date. Donc on ne peut pas calculer les années, mois, ... à partir de la différence de 2 dates vu qu'une année et un mois ne comptent pas le même nombre de jour suivant l'année.
    De toute façon, son exercice n'est pas un exercice sur les dates mais plutôt sur un algorithme sur les modulos

    Par contre Mysti¢, si tu veux quelquechose d'un peu plus automatique, regarde l'exemple que j'ai donné avec la fonction divmod.
    Sinon ton input devrait fonctionner comme tu le souhaite

  11. #11
    Membre régulier Avatar de Mysti¢
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 155
    Points : 116
    Points
    116
    Par défaut
    Citation Envoyé par Guigui_
    De toute façon, son exercice n'est pas un exercice sur les dates mais plutôt sur un algorithme sur les modulos
    Exact, la vous me parlez de chose que je n'est jamais abordé

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour.
    Je suis désolé de faire remonter le sujet, mais il y a quelque chose que je ne comprends pas.

    C'est à propos de rest. Est ce une variable désignée au même titres que mois, annees etc... ?

    Quel est son rôle ?
    annee * annees = a, non ?
    donc rest = 0... je ne comprends pas vraiment là.

    Merci
    Au revoir

  13. #13
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2016
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Je remonte le fil du sujet.
    J'ai une remarque sur la réponse de Guigui du 13 novembre 2005.
    L'algorithme est très habile et élégant, il m'a été vraiment utile. Merci avant tout. Cependant, il ne supporte pas une durée avec en entrée des secondes non entières.

    J'ai ajouté au test la vérification de l'indice.
    J'ai complété l'algo pour avoir aussi les millisecondes.
    Notez que la valeur est arrondie à l'entier inférieur.

    Je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rest = 277532.5234
    conv = (31536000,2592000,86400,3600,60,1,0.001)
    result = [0,0,0,0,0,0,0]
    i=0
    while rest>0 and i<=6 :
        result[i], rest = divmod(rest,conv[i] )
        i+=1
     
    duree = str(int(result[0])) + " année(s), " + str(int(result[1])) + " mois, " + str(int(result[2])) + " jour(s), " + str(int(result[3])) + " heure(s), " + str(int(result[4])) + " minute(s), " + str(int(result[5])) + " seconde(s), " + str(int(result[6])) + " millisecondes"
    print ("Durée en années, mois, jours, minutes, secondes, millisecondes : ", duree)

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 440
    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 440
    Points : 37 032
    Points
    37 032
    Par défaut
    Citation Envoyé par Le_Chirurgien_Bleu Voir le message
    Je remonte le fil du sujet.
    J'ai une remarque sur la réponse de Guigui du 13 novembre 2005.
    L'algorithme est très habile et élégant, il m'a été vraiment utile. Merci avant tout. Cependant, il ne supporte pas une durée avec en entrée des secondes non entières.

    J'ai ajouté au test la vérification de l'indice.
    J'ai complété l'algo pour avoir aussi les millisecondes.
    Notez que la valeur est arrondie à l'entier inférieur.

    Je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rest = 277532.5234
    conv = (31536000,2592000,86400,3600,60,1,0.001)
    result = [0,0,0,0,0,0,0]
    i=0
    while rest>0 and i<=6 :
        result[i], rest = divmod(rest,conv[i] )
        i+=1
     
    duree = str(int(result[0])) + " année(s), " + str(int(result[1])) + " mois, " + str(int(result[2])) + " jour(s), " + str(int(result[3])) + " heure(s), " + str(int(result[4])) + " minute(s), " + str(int(result[5])) + " seconde(s), " + str(int(result[6])) + " millisecondes"
    print ("Durée en années, mois, jours, minutes, secondes, millisecondes : ", duree)
    Si c'est juste pour s'exercer avec divmod, vous n'améliorez pas grand chose puisque vous ne tenez pas compte de la remarque sur le calcul des années/mois.
    Si ce n'est pas pour s'execer avec "divmod", timedelta du module datetime fait cela très bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from datetime import timedelta
    >>> print(timedelta(seconds=277532.5234))
    3 days, 5:05:32.523400
    >>>
    - W

Discussions similaires

  1. conversion du format rm au format audio
    Par WELCOMSMAIL dans le forum Audio
    Réponses: 3
    Dernier message: 19/04/2007, 14h43
  2. pb de conversion de format
    Par Jean-Matt dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 15h37
  3. Conversion de format de date
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 03/10/2005, 11h39
  4. Conversion secondes
    Par Vodkha dans le forum Langage
    Réponses: 1
    Dernier message: 18/08/2005, 12h55
  5. Réponses: 11
    Dernier message: 02/09/2003, 15h20

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