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 :

reunion de date et données manquantes [Python 3.X]


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut reunion de date et données manquantes
    Bonjour,
    J'ai plusieurs fichiers csv que je voudrais réunir.
    Dans chaque csv, j'ai une date sur la première colonne et une données (int) sur la deuxième.
    Je souhaiterais réunir les fichiers csv en un seul avec la date dans la première colonne et les données dans les autres (pour 2017,2018,2019 et 2020).
    Le problème, c'est que sur certains csv, je n'ai pas forcément les mêmes dates : parfois, il y en a en plus et parfois en moins (par exemple, 2020 n'est pas complet)
    Il faudrait que je complète avec un None lorsque la donnée est manquante car je souhaite ensuite obtenir un graphe et il me faut donc le même nombre de données partout.
    Voici mon code pour l'année 2019 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with open("datas.csv",'w',encoding = "utf-8", newline='') as data_fich:
        wr = csv.writer(data_fich)
        for date,el_2019 in zip(new_date_2019,voeux_cpge_2019):
            wr.writerow([date,el_2019])
    data_fich.close()
    J'obtiens (le début) :
    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
    24-Janvier	11
    27-Janvier	27
    28-Janvier	33
    29-Janvier	34
    30-Janvier	37
    31-Janvier	41
    01-Février	44
    02-Février	44
    03-Février	46
    04-Février	50
    05-Février	51
    06-Février	51
    07-Février	53
    08-Février	57
    09-Février	58
    10-Février	59
    12-Février	66
    13-Février	68
    14-Février	69
    J'espère avoir été assez clair.
    Je ne sais pas trop comment m'y prendre.
    J'ai des idées mais je crains que mes idées mènenet à un code illisible et compliqué.

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

    A priori, je fabriquerais un dictionnaire.
    La date étant la clef avec pour valeur la liste des données lues dans les différents fichiers: liste[0] serait la donnée lue dans le premier fichier, liste[1] celle qui est lue dans le second, etc...
    On sait le nombre de fichiers qu'il y a à lire et donc la longueur de la liste associée à chaque clef qu'on peut initialiser avec autant de None.
    A la lecture du i-ème fichier, si la clef n'existe pas on la crée avec sa liste associée plein de None et on met à jour valeur[i].

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

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci wiztricks,
    cela faisait partie de mes idées, le souci, je crois, c'est qu'un dictionnaire n'est pas ordonné.
    Si c'est le cas, il faudra que je le réordonne et je reporte le pb.
    Ceci dit, je ne maîtrise pas bien les dictionnaires ni les ensembles d'ailleurs.

  4. #4
    Membre très actif Avatar de viper1094
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 570
    Par défaut
    Salut,

    Python (comme beaucoup de langage) à une structure de données semblable aux dictionnaires, mais triés:
    https://docs.python.org/fr/3/library...ns.OrderedDict
    C'est probablement ce que tu cherches

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

    Citation Envoyé par marco056 Voir le message
    cela faisait partie de mes idées, le souci, je crois, c'est qu'un dictionnaire n'est pas ordonné.
    Si c'est le cas, il faudra que je le réordonne et je reporte le pb.
    Ce que j'ai compris du problème de départ était la gestion des "trous" dans les données récupérées dans les N fichiers.
    Et l'idée de base est d'initialiser une liste à N fois None où la colonne i sera la donnée du ième fichier.

    Si vous voulez faire çà avec des listes de listes (un tableau) et des insertions "ordonnées", ce seront des listes qui commencent par la "date" suivie de N None.

    Si vos fichiers sont déjà triés, çà pourrait être plus performant que de passer par un dictionnaire: inutile de parcourir toute la liste à chaque fois.

    Citation Envoyé par marco056 Voir le message
    Ceci dit, je ne maîtrise pas bien les dictionnaires ni les ensembles d'ailleurs.
    Dans le cas contraire, ce pourrait être l'occasion de regarder à quoi çà ressemble et ce qu'on peut faire avec.
    note: et oui il faudra trier ensuite mais sorted fera le boulot pour vous.

    Citation Envoyé par viper1094 Voir le message
    Python (comme beaucoup de langage) à une structure de données semblable aux dictionnaires, mais triés:
    https://docs.python.org/fr/3/library...ns.OrderedDict
    C'est probablement ce que tu cherches
    OrderedDict préserve l'ordre d'insertion pas la relation d'ordre qu'on pourrait avoir sur les clefs.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> d = OrderedDict.fromkeys('cdbef')
    >>> d.keys()
    odict_keys(['c', 'd', 'b', 'e', 'f'])
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci à vous, voici où j'en suis rendu :
    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
    24
    25
    26
    27
    28
    from collections import OrderedDict
    nb_a = [0, 5, 5, 11, 13]
    dat_a = ['22-Janvier', '23-Janvier', '24-Janvier', '25-Janvier', '26-Janvier']
    nb_b = [11, 27, 33, 34, 37, 41, 44, 44, 46, 50, 51, 51, 53, 57, 58, 59, 66, 68, 69, 71, 74, 76, 79, 83, 87, 89, 90, 90, 91, 96, 99, 102, 107, 109, 122, 133, 141, 148, 155, 157, 161, 163, 170, 174, 176, 180, 186, 186, 186]
    dat_b = ['24-Janvier', '27-Janvier', '28-Janvier', '29-Janvier', '30-Janvier', '31-Janvier', '01-Février', '02-Février', '03-Février', '04-Février', '05-Février', '06-Février', '07-Février', '08-Février', '09-Février', '10-Février', '12-Février', '13-Février', '14-Février', '15-Février', '16-Février', '17-Février', '18-Février', '19-Février', '20-Février', '21-Février', '22-Février', '23-Février', '24-Février', '25-Février', '26-Février', '27-Février', '28-Février', '01-Mars', '03-Mars', '04-Mars', '05-Mars', '06-Mars', '07-Mars', '08-Mars', '09-Mars', '10-Mars', '11-Mars', '12-Mars', '13-Mars', '14-Mars', '15-Mars', '03-Avril', '10-Avril']
    nb_c = [177, 183, 191, 191, 191, 191, 191]
    dat_c = ['12-Mars', '13-Mars', '14-Mars', '15-Mars', '18-Mars', '31-Mars', '07-Avril']
    nb_d = [134, 134, 134]
    dat_d = ['14-Mars', '15-Mars', '18-Mars']
    dat_tot = list(set().union(dat_a,dat_b,dat_c,dat_d))
    print(dat_tot)
     
    def creer_dico(liste_dat,liste_nb):
        dico = OrderedDict()
        for i in range(len(liste_dat)):
            dico[liste_dat[i]] = liste_nb[i]
        return dico
     
     
    dico_a = creer_dico(dat_a,nb_a)
    dico_b = creer_dico(dat_b,nb_b)
    dico_c = creer_dico(dat_c,nb_c)
    dico_d = creer_dico(dat_d,nb_d)
     
    print(dico_a)
    print(dico_b)
    print(dico_c)
    print(dico_d)
    Il va falloir que je me penche sur l'union de ces dictionnaires ordonnées.
    Si vous pensez que je fais fausse route, dites-le moi...

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

    Je ne sais pas dans quel délire vous êtes parti mais pour "ranger" vos dates par ordre croissant, il faudrait avoir une représentation "cohérente" or ici "14-Mars" < "20-Janvier"...

    Ensuite simplifiez et reformulez votre problème!
    Vous avez 2 listes de tuples [['a', 1), ('b', 1)] et [['b', 2), ('c', 1)] et vous cherchez à obtenir [ ('a', 1, None), ('b', 1, 2), ('c', None, 2)]

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

  8. #8
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Je ne sais pas dans quel délire vous êtes parti mais pour "ranger" vos dates par ordre croissant, il faudrait avoir une représentation "cohérente" or ici "14-Mars" < "20-Janvier"...

    Ensuite simplifiez et reformulez votre problème!
    Vous avez 2 listes de tuples [['a', 1), ('b', 1)] et [['b', 2), ('c', 1)] et vous cherchez à obtenir [ ('a', 1, None), ('b', 1, 2), ('c', None, 2)]

    - W
    Je dois être trop fatigué, je reprendrais cela plus tard.
    Sinon, mes dates sont bien rangées dans les listes de départ.
    Merci quand même.

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Voici ce que j'ai fait, cela me paraît bien compliqué...

    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
    tot=[]
    t1,t2 = [('a',1),('b',1)],[('b',2),('c',1)]
    for el1,el2 in zip(t1,t2):
        if el1[0] not in tot:
            tot.append(el1[0])
        if el2[0] not in tot:
            tot.append(el2[0])
     
    print(tot)
     
    liste_finale=[[el,None,None] for el in tot]
    print(liste_finale)
    for j in range(len(tot)):
        for i in range(len(t1)):
            if t1[i][0] == liste_finale[j][0]:
                liste_finale[j][1] = t1[i][1]
        for k in range(len(t2)):
            if t2[k][0] == liste_finale[j][0]:
                liste_finale[j][2] = t2[k][1]
    print(liste_finale)

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Voici ce que j'ai fait, cela me paraît bien compliqué...
    Le plus simple est d'utiliser les dictionnaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t1,t2 = [('a',1),('c',1)],[('b',2),('c',2), ('e', 2)]
    table = {}
    fichiers = t1, t2
    for k, f in enumerate(fichiers):
        for d, v in f:
            table.setdefault(d, [None,] * len(fichiers))[k] = v
    items = sorted(table.items(), key=lambda z: z[0])
    print(items)
    Après, en supposant que les listes soient "rangées", c'est plus compliqué (d'en profiter):
    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
    t1,t2 = [('a',1),('c',1)],[('b',2),('c',2), ('e', 2)]
    table = []
    fichiers = t1, t2
    for d, v in fichiers[0]:
        table.append([d, v] + [None, ]*(len(fichiers)-1))
    for k, f in enumerate(fichiers[1:], start=2):
        ix = 0
        for d, v in f:
            for i, e in enumerate(table[ix:]):
                if e[0] >= d:
                    ix += i
                    if e[0] > d:
                        ix += 1
                        table.insert(ix, [d] + ([None,] * len(fichiers)))
                    break
            else:
                ix = len(table)
                table.append([d] + ([None,] * len(fichiers)))
            table[ix][k] = v
    print (table)
    çà devrait fonctionner (et pardon pour les bugs, ce fut mollement testé).

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

  11. #11
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci wiztricks, je vais creuser tes solutions.
    En attendant, j'ai fait un truc qui me semble à peu près correct.
    Mais... il faut que j'ordonne les dates.
    J'ai tenté avec sort et key mais cela ne fonctionne pas.
    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
    24
    25
    26
    27
    28
    29
    30
    31
    nb_a = [0, 5, 5, 11, 13]
    dat_a = ['22-Janvier', '23-Janvier', '24-Janvier', '25-Janvier', '26-Janvier']
    nb_b = [11, 27, 33, 34, 37, 41, 44, 44, 46, 50, 51, 51, 53, 57, 58, 59, 66, 68, 69, 71, 74, 76, 79, 83, 87, 89, 90, 90, 91, 96, 99, 102, 107, 109, 122, 133, 141, 148, 155, 157, 161, 163, 170, 174, 176, 180, 186, 186, 186]
    dat_b = ['24-Janvier', '27-Janvier', '28-Janvier', '29-Janvier', '30-Janvier', '31-Janvier', '01-Février', '02-Février', '03-Février', '04-Février', '05-Février', '06-Février', '07-Février', '08-Février', '09-Février', '10-Février', '12-Février', '13-Février', '14-Février', '15-Février', '16-Février', '17-Février', '18-Février', '19-Février', '20-Février', '21-Février', '22-Février', '23-Février', '24-Février', '25-Février', '26-Février', '27-Février', '28-Février', '01-Mars', '03-Mars', '04-Mars', '05-Mars', '06-Mars', '07-Mars', '08-Mars', '09-Mars', '10-Mars', '11-Mars', '12-Mars', '13-Mars', '14-Mars', '15-Mars', '03-Avril', '10-Avril']
    nb_c = [177, 183, 191, 191, 191, 191, 191]
    dat_c = ['12-Mars', '13-Mars', '14-Mars', '15-Mars', '18-Mars', '31-Mars', '07-Avril']
    nb_d = [134, 134, 134]
    dat_d = ['14-Mars', '15-Mars', '18-Mars']
     
    tot=[]
    for el1 in dat_a:
        if el1 not in tot:
            tot.append(el1)
    for el2 in dat_b:
        if el2 not in tot:
            tot.append(el2)
    for el3 in dat_c:
        if el3 not in tot:
            tot.append(el3)
    for el4 in dat_d:
        if el4 not in tot:
            tot.append(el4)
     
    print(tot)
     
    tot_split=[el.split("-") for el in tot]
    print(tot_split)
    months = {"Janvier":0, "Février":1, "Mars":2, "Avril":3 }
    def val_mois(date):
        return months[date[1]]
    print(tot_split.sort(key=val_mois))
    Edit : déjà, j'ai beaucoup de mal avec ton premier code

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

    Ligne 31, tot_split.sort(...) retourne None... mais trie la liste en fonction de ce que retourne val_mois qui est insuffisant car çà ne tient pas compte du jour dans le mois.

    Citation Envoyé par marco056 Voir le message
    Edit : déjà, j'ai beaucoup de mal avec ton premier code
    Désolé... je l'ai mis à jour. Il est beaucoup plus simple avec .setdefault (et sans construire le dico à part).

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

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci wiztricks, cela fonctionne bien. J'obtiens la même chose qu'avec mon usine à gaz :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('01-Février', [None, None, 44, None]), ('01-Mars', [None, None, 109, None]), ('02-Février', [None, None, 44, None]), ('03-Avril', [None, None, 186, None]), ('03-Février', [None, None, 46, None]), ('03-Mars', [None, None, 122, None]), ('04-Février', [None, None, 50, None]), ('04-Mars', [None, None, 133, None]), ('05-Février', [None, None, 51, None]), ('05-Mars', [None, None, 141, None]), ('06-Février', [None, None, 51, None]), ('06-Mars', [None, None, 148, None]), ('07-Avril', [None, 191, None, None]), ('07-Février', [None, None, 53, None]), ('07-Mars', [None, None, 155, None]), ('08-Février', [None, None, 57, None]), ('08-Mars', [None, None, 157, None]), ('09-Février', [None, None, 58, None]), ('09-Mars', [None, None, 161, None]), ('10-Avril', [None, None, 186, None]), ('10-Février', [None, None, 59, None]), ('10-Mars', [None, None, 163, None]), ('11-Mars', [None, None, 170, None]), ('12-Février', [None, None, 66, None]), ('12-Mars', [None, 177, 174, None]), ('13-Février', [None, None, 68, None]), ('13-Mars', [None, 183, 176, None]), ('14-Février', [None, None, 69, None]), ('14-Mars', [134, 191, 180, None]), ('15-Février', [None, None, 71, None]), ('15-Mars', [134, 191, 186, None]), ('16-Février', [None, None, 74, None]), ('17-Février', [None, None, 76, None]), ('18-Février', [None, None, 79, None]), ('18-Mars', [134, 191, None, None]), ('19-Février', [None, None, 83, None]), ('20-Février', [None, None, 87, None]), ('21-Février', [None, None, 89, None]), ('22-Février', [None, None, 90, None]), ('22-Janvier', [None, None, None, 0]), ('23-Février', [None, None, 90, None]), ('23-Janvier', [None, None, None, 5]), ('24-Février', [None, None, 91, None]), ('24-Janvier', [None, None, 11, 5]), ('25-Février', [None, None, 96, None]), ('25-Janvier', [None, None, None, 11]), ('26-Février', [None, None, 99, None]), ('26-Janvier', [None, None, None, 13]), ('27-Février', [None, None, 102, None]), ('27-Janvier', [None, None, 27, None]), ('28-Février', [None, None, 107, None]), ('28-Janvier', [None, None, 33, None]), ('29-Janvier', [None, None, 34, None]), ('30-Janvier', [None, None, 37, None]), ('31-Janvier', [None, None, 41, None]), ('31-Mars', [None, 191, None, None])]
    Cela fait un code en effet très compact et efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data_2020 = [(el1,el2) for el1,el2 in zip(new_date_2020,voeux_cpge_2020)]
    data_2019 = [(el1,el2) for el1,el2 in zip(new_date_2019,voeux_cpge_2019)]
    data_2018 = [(el1,el2) for el1,el2 in zip(new_date_2018,voeux_cpge_2018)]
    data_2017 = [(el1,el2) for el1,el2 in zip(new_date_2017,voeux_cpge_2017)]
     
    table = {}
    fichiers = data_2017,data_2018,data_2019,data_2020
    for k, f in enumerate(fichiers):
        for d, v in f:
            table.setdefault(d, [None,] * len(fichiers))[k] = v
    items = sorted(table.items(), key=lambda z: z[0])
    print(items)
    Cependant, je rencontre le même problème, à savoir le classement par dates croissantes, sachant que je vais de janvier à avril.
    J'ai bien compris qu'il me manquait quelque chose mais j'ai beau faire des recherches, je ne vois pas.

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

    Citation Envoyé par marco056 Voir le message
    J'ai bien compris qu'il me manquait quelque chose mais j'ai beau faire des recherches, je ne vois pas.
    Je ne vois pas trop ce que vous cherchez.
    Commencez par réfléchir à ce que vous voulez!

    Pour trier suivant des dates croissantes, il fabriquer une fonction qui, récupérant la chaine de caractères "09-Février", retournera le tuple (1, 9) où le premier élément sera le n°du mois et le second, l'entier correspondant au jour (ou seulement la chaine de caractères "01" si vous êtes sûr que les jours sont bien tous représentés sur 2 caractères).

    Ce qui ne devrait pas être si compliqué à coder.

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

  15. #15
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    La fonction n'est pas difficile en effet, c'est plutôt le tri avec cette fonction qui me pose problème. Je vais y réfléchir encore.

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par marco056 Voir le message
    La fonction n'est pas difficile en effet, c'est plutôt le tri avec cette fonction qui me pose problème. Je vais y réfléchir encore.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    items = sorted(table.items(), key=lambda z: f(z[0]))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    items = sorted(table.items(), key=f)
    dans ce cas, f reçoit toute la "ligne"/item et ne travaille que sur le premier élément.

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

  17. #17
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci beaucoup wiztricks.
    J'ai toujours du mal avec les structures un peu élaborées, je n'utilise quotidiennement que les bases.
    Sorted, c'est une fois par an...

  18. #18
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je débarque un peu à la bourre mais si des fois ce peut être utile, pandas gère particulièrement bien les séries temporelles :

    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
    24
    25
    26
    27
    28
    29
    30
    import pandas as pd
    import locale
    locale.setlocale(locale.LC_TIME, "fr_FR")
     
    # je reprends les données plus haut
    # j'ajoute juste un '13-Mars' dans dat_a qui chevauche dans dat_b avec une valeur aberrante/bien visible
    nb_a = [0, 5, 5, 11, 13, 10000]
    dat_a = ['22-Janvier', '23-Janvier', '24-Janvier', '25-Janvier', '26-Janvier', '13-Mars']
    nb_c = [177, 183, 191, 191, 191, 191, 191]
    dat_c = ['12-Mars', '13-Mars', '14-Mars', '15-Mars', '18-Mars', '31-Mars', '07-Avril']
     
    # on concatène un '-2020', ça mange pas de pain et ça évite de se retrouver en 1900
    dat_a = list(map(lambda x: x+'-2020', dat_a))
    dat_c = list(map(lambda x: x+'-2020', dat_c))
     
    # on fourre le tout dans un dataframe avec dat_a/nb_a
    df1 = pd.DataFrame.from_dict(dict(zip(dat_a, nb_a)), orient='index', columns=['nb'])
    df1.index = pd.to_datetime(df1.index, format='%d-%B-%Y')
     
    # idem pour dat_c/nb_c
    df2 = pd.DataFrame.from_dict(dict(zip(dat_c, nb_c)), orient='index', columns=['nb'])
    df2.index = pd.to_datetime(df2.index, format='%d-%B-%Y')
     
    # on combine les deux, on re-cast en int et on récupère l'affichage initial de la date en 'jour-mois' pour que ce soit joli tout plein
    df = df1.combine(df2, lambda x1,x2: x1+x2, fill_value=0)
    df.nb = df.nb.astype(int)
    df.index = df.index.strftime('%d-%B')
     
    # vers CSV
    print(df.to_csv(header=False, sep=','))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    22-janvier,0
    23-janvier,5
    24-janvier,5
    25-janvier,11
    26-janvier,13
    12-mars,177
    13-mars,10183    # x1+x2
    14-mars,191
    15-mars,191
    18-mars,191
    31-mars,191
    07-avril,191

  19. #19
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci BufferBob,
    Je me pencherai sur ta solution.
    Pour l'instant, cela fonctionne, je ne touche à rien

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

Discussions similaires

  1. [AC-2003] Données manquantes par date
    Par elokapo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/05/2013, 16h06
  2. Importation date avec beaucoup de données manquantes
    Par soph35 dans le forum SAS Base
    Réponses: 2
    Dernier message: 20/02/2013, 17h14
  3. [Oracle][Delphi]Données manquantes apre sun select
    Par LAPLACE dans le forum Oracle
    Réponses: 3
    Dernier message: 24/09/2007, 13h40
  4. mauvais controlfile créé - données manquantes
    Par saptech dans le forum Administration
    Réponses: 6
    Dernier message: 01/07/2007, 13h06
  5. Remplacement données manquantes
    Par HurtMarley dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2006, 11h36

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