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 une date directement depuis un élément d'une liste


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut Convertir une date directement depuis un élément d'une liste
    Bonjour à tous,

    Je me permets de vous contacter car j'ai un petit souci avec la conversion de mes dates directement dans une liste je m'explique:

    J'utilise l'API Red Hat 5.6 Overview

    Tout d'abord j'ai ma fonction def station
    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
     
    def stations(request):
     
    #ici je récupère la clé de session
        key = request.session['key'] 
    # ensuite j'ai créée deux variable pour récupérer les éléments que me retourne la méthode de l'API à savoir client.system.listActiveSystems(key) et client.system.listInactiveSystems(key)
        sys_active = [(system['name'],system['last_checkin']) for system in client.system.listActiveSystems(key)]
        sys_inactive = [(system['name'],system['last_checkin']) for system in client.system.listInactiveSystems(key)]
    # boucle disant que pour l'élément system['last_checkin']  qui me retourne la date du système de me convertir au format suivant: 
        for system['last_checkin'] in sys_active, sys_inactive:
            date = datetime.strptime(str(system['last_checkin']), "%d/%m/%Y à %H:%M:%S")
    # je retourne mes éléments pour l'afficher en html 
        return {
                'sys_active':sys_active,
                'sys_inactive':sys_inactive,
                }
    A la sortie des listes sys_active et sys_inactive, j'ai ce retour-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [('system1', <DateTime '20150317T08:58:52' at 1cb1b00>), ('system13', <DateTime '20150317T07:39:39' at 1cb19e0>), ('system12', <DateTime '20150317T08:58:59' at 1cb1c20>)]
    Il me retourne le problème " does not match format" que j'ai bien compris. C'est ainsi que je m'adresse à vous pour m'aider à chercher une solution au problème.

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Dans un cas pareil, on procède d'abord ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        for system['last_checkin'] in sys_active, sys_inactive:
            print system['last_checkin']
            date = datetime........
    Mais déjà on peut s'étonner de cette structure, dans ta boucle for sys_active, sys_inactive constituent un tuple de listes.

    Donc normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> a = ["h", "n", "j", "k"]
    >>> b = ["l", "o", "m", "g"]
    >>> for c in a, b:
    ...     print c
    ... 
    ['h', 'n', 'j', 'k']
    ['l', 'o', 'm', 'g']
    Et si je veux un élément seul de chacune des listes, si je procède ainsi, c'est-à-dire comme toi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> for c[1] in a, b:
    ...     print c[1]
    ... 
    ['h', 'n', 'j', 'k']
    ['l', 'o', 'm', 'g']
    >>>
    pas vraiment ce que j'espérais.


    Par contre en procédant ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> for c in a, b:
    ...     print c[1]
    ... 
    n
    o
    >>>
    c'est déjà beaucoup plus clair.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    '+' permet de concaténer (si tant est que ce soit ce qu'on souhaite):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> a = ["h", "n", "j", "k"]
    >>> b = ["l", "o", "m", "g"]
    >>> for c in a+b:
    ...     print (c)
    ...
    h
    n
    j
    k
    l
    o
    m
    g
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je pense que le problème vient de ce que l'OP pense que en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sys_active = [(system['name'],system['last_checkin']) for system in client.system.listActiveSystems(key)]
    la liste sys_active contient des objets system['name'] et system['last_checkin'] ce qui est faux ce sont les valeurs associées à ces clefs qui sont placées dans la liste.

    Si je comprend bien du moins.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Merci pour les exemples mais je souhaite avant tout simplifier mon code.

    A vrai dire pour la conversion je souhaiterais convertir à la volée mon élément system[last_checkin] afin que dans mes deux listes, je puisse déja avoir l'élément date converti en 17/02/2015 à 08:13/47 et non dans le format <DateTime '20150317T08:13:47' at 3560a70> par exemple.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Bien, effectivement la structure de ma boucle n'était pas bonne.
    Du coup, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     for sys_date in sys_active, sys_inactive:
        #    date = datetime.strptime(str(system['last_checkin']), "%d/%m/%Y à %H:%M:%S")
              print sys_date[1]
    Il me retourne donc mes dates au format orginal :
    '20150317T07:39:39'
    ...
    ....etc

    Maintenant je souhaiterais pouvoir les convertir à la volée tout en les stockant dans mes 2 listes. Histoire de simplifier le code. Est-ce possible.

    C'est plutot de faire en 2 étapes avec la récupération des dates en les stockant dans une liste à part je souhaiterais directement l'inclure au format idéal dans mes deux listes déja toute faite.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Pour faire çà, il peut être utile de lancer la console pour tester que vos instructions font ce que vous en attendez avant de vouloir les intégrer dans le code.
    La première étape est de convertir un datetime dans le format que vous voulez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import datetime
    >>> dt = datetime.datetime.now()
    >>> dt.strftime("%d/%m/%Y à %H:%M:%S")
    '17/03/2015 à 13:28:19'
    Puis vous fabriquez une liste semblable à celle que vous allez récupérer en entrée de boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> L
    [('a', datetime.datetime(2015, 3, 17, 13, 27, 51, 232991)), ('b', datetime.datet
    ime(2015, 3, 17, 13, 27, 51, 232991)), ('c', datetime.datetime(2015, 3, 17, 13,
    27, 51, 232991)), ('d', datetime.datetime(2015, 3, 17, 13, 27, 51, 232991)), ('e
    ', datetime.datetime(2015, 3, 17, 13, 27, 51, 232991))]
    Reste à fabriquer une nouvelle liste à partir de là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> L = [ (s, dt.strftime("%d/%m/%Y à %H:%M:%S")) for s, dt in L ]
    >>> L
    [('a', '17/03/2015 à 13:27:51'), ('b', '17/03/2015 à 13:27:51'), ('c', '17/03/20
    15 à 13:27:51'), ('d', '17/03/2015 à 13:27:51'), ('e', '17/03/2015 à 13:27:51')]
    Si cela correspond à ce que vous vouliez, vous pouvez passer à l'étape suivante: l'intégrer dans le code.

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

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Merci wiztricks, pour ton aide.

    Cependant j'ai une liste d'éléments qui me retourne pour chaque system : l'id, le nom du système et la date format original.

    En voici un extrait :

    [(123456, 'system1', <DateTime '20150318T07:39:40' at 388b6c8>), (789456, 'system2', <DateTime '20150318T10:01:01' at 388b710>), (147852, 'system3', <DateTime '20150318T10:01:02' at 388b758>), (159753, 'system4', <DateTime '20150318T09:02:32' at 388b7a0>)]

    Au total, j'ai plus de 50 systèmes en somme.

    J'ai deux questions, ma première est :

    Comment puis je afficher que les nom uniquement de mes systèmes? Comme ça je pourrais récupérer les autres éléments de cette même façon.

    Afin que j'ai par ex: une liste nom_system qui me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['system1' , 'system2' ]
    ...etc

    Comment je peux convertir de la façon la plus optimal possible (niveau code) mes dates? Afin d'éviter de faire plusieurs listes ...etc
    Par ex :
    J'aimerais pouvoir récupérer ce genre de résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [(123456, 'system1', '18/03/2015 à 07:39:40' ), (789456, 'system2', '18/03/2015 à 10:01:01'), (147852, 'system3', '18/03/2015 à 10:01:02'), (159753, 'system4', '18/03/2015 à 09:02:32')]

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par Taylor08 Voir le message
    Cependant j'ai une liste d'éléments qui me retourne pour chaque system : l'id, le nom du système et la date format original.

    En voici un extrait :

    [(123456, 'system1', <DateTime '20150318T07:39:40' at 388b6c8>), (789456, 'system2', <DateTime '20150318T10:01:01' at 388b710>), (147852, 'system3', <DateTime '20150318T10:01:02' at 388b758>), (159753, 'system4', <DateTime '20150318T09:02:32' at 388b7a0>)]

    Au total, j'ai plus de 50 systèmes en somme.
    Comment puis je afficher que les nom uniquement de mes systèmes? Comme ça je pourrais récupérer les autres éléments de cette même façon.
    Afin que j'ai par ex: une liste nom_system qui me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['system1' , 'system2' ]
    ...etc
    Appelons L cette liste. C'est une liste de tuples. Si vous voulez afficher le 2ème élément de chaque tuple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> for e in L:
    ...        print(e[1])
    Citation Envoyé par Taylor08 Voir le message
    Comment je peux convertir de la façon la plus optimal possible (niveau code) mes dates? Afin d'éviter de faire plusieurs listes ...etc
    Par ex :
    J'aimerais pouvoir récupérer ce genre de résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [(123456, 'system1', '18/03/2015 à 07:39:40' ), (789456, 'system2', '18/03/2015 à 10:01:01'), (147852, 'system3', '18/03/2015 à 10:01:02'), (159753, 'system4', '18/03/2015 à 09:02:32')]
    C'était déjà le sujet de mon post précédent: traiter une liste de tuples à 3 éléments est semblable au traitement d'une liste de tuples à 2 éléments.

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

  10. #10
    Membre très actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Appelons L cette liste. C'est une liste de tuples. Si vous voulez afficher le 2ème élément de chaque tuple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> for e in L:
    ...        print(e[1])


    C'était déjà le sujet de mon post précédent: traiter une liste de tuples à 3 éléments est semblable au traitement d'une liste de tuples à 2 éléments.

    - W
    Donc il doit utiliser un genre de slice pour récupérer ce qu'il veut (dans ton exemple , vous utilisez clairement un index ) .

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    J'ai une question :
    Comment fait on pour récupérer uniquement cet élément '20150320T11:21:54' dans un <DateTime '20150320T11:21:54' at 36bbef0>
    Sachant que ma liste me retourne les dates dans un tuple.

    Ma liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    checkdate = [system['last_checkin'] for system in client.system.listActiveSystems(key)]
    # Resultat 
    # [<DateTime '20150320T11:21:54' at 36bbef0> , <DateTime '20150320T11:20:44' at 36bbef0> , ... ] ....et ainsi de suite
    Ma récupération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    date = datetime.strptime(str(checkdate), '%Y%m%dT%H:%M:%S' ) 
    # Mon but avoir que ça en retour : '20150320T11:21:54' , .... et ainsi de suite


    Mais je n'arrive pas à récupérer l'élément qu'il me faut.
    Erreur : ValueError: time data.

    Une solution?

  12. #12
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Peut-être en itérant à l'aide d'une boucle la liste checkdate ?

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Oui ça fonctionne. Sauf qu'il fallait mettre la méthode join().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    date = [(', '.join(str(i) for i in checkdate))]

  14. #14
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    En fait non je constate que ce n'est pas tout à fait ça que je souhaites.

    Je m'explique :

    J'aimerais pouvoir récupérer une liste tout simple avec le format date adéquat.

    Ici c'est le retour que j'aimerais avoir avec un index par element
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ['20150320T14:10:34', '20150320T11:21:54', '20150320T14:58:57', '20150320T15:01:01', '20150320T14:42:29', '20150320T14:50:53', '20150320T14:36:57', '20150320T15:01:02', '20150320T14:59:17', '20150320T15:03:32', '20150320T14:28:54', '20150320T15:01:03', '20150320T15:01:02', '20150320T15:01:01', '20150320T12:42:11', '20150320T15:01:02']
    Hors ici avec le join (ci-dessous), je me retrouve avec tous mes éléments dans un seul et ce n'est pas ça que je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    date = [(', '.join(str(i) for i in checkdate))]

    Quelqu'un pour m'aider?

  15. #15
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je n'ai pas suivi la discussion, mais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for date in checkdate:
        value = time.strptime(date, '%Y%m%dT%H:%M:%S')
        print value


    ne fonctionnerait pas ?

  16. #16
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 95
    Par défaut
    Enfiin j'ai pu trouvé, comment on fait cette fameuse conversion à la volée sans même faire plusieurs listes ce qui était le but.

    Voici comment j'ai pu le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    list_active = [
                (
                   system['id'],
                   system['name'],
                   # Je recupère par ex <Datetime '20150320T14:58:57'....> , l'objet value me permet de récupérer le string soit "20150320T14:58:57" , enfin je le convertis au format que je veux. 
                   # Voci comment j'ai pu avoir en retour, une liste avec mon élément "last checkin" qui l'a convertit à la volée.
                   datetime.strptime(system['last_checkin'].value, "%Y%m%dT%H:%M:%S").strftime('%d/%m/%Y')
                     ) for system in client.system.listActiveSystems(key)]
    Merci quand même pour votre aide.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2015, 15h11
  2. Réponses: 12
    Dernier message: 29/03/2012, 13h47
  3. Réponses: 11
    Dernier message: 28/04/2009, 15h58
  4. Réponses: 2
    Dernier message: 30/08/2006, 10h50

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