4 votes

besoin de créer une liste à partir d'un fichier texte

J'ai besoin de retourner une liste de paires (datetime.date(x,y,z), nombre de fois où elle apparaît) dans un fichier texte de 1 000 entrées. La fonction def eventfreq(year, month): prend comme paramètres l'année et le mois du fichier datetime.date mentionné précédemment. Jusqu'à présent, j'ai défini l'année et le mois

def eventfreq(year, month):
    F=fieldict('DOT1000.txt')
    for line in F:
        year=F[1].year
        month=F[1].month

fieldict est une fonction qui prend un tuple de (Fabricant, datetime.date(), année, accident, blessure) pour chaque entrée du fichier. J'ai seulement besoin d'extraire la date de chaque entrée. Je suis très novice en Python, j'ai travaillé toute la nuit sur plusieurs de ces fonctions.

EDIT : Echantillon de données :

CHEVROLET LUMINA 1990 19920606 N 0 0 SERVICE FREINS, HYDRAULIQUE:COMPOSANTS DE BASE:DISQUE:ÉTRIER DRACUT MA 2G1WN14T9L9 19950110 19950110 PROBLÈME DE GEL DES ÉTRIERS LE FABRICANT N'OFFRE AUCUNE ASSISTANCE. TT EVOQ

C'est une entrée sur 1 000. J'ai besoin de conseils sur la façon de construire ma liste de paires [(datetime.date(), #of occurrences in the file)]. L'année et le mois sont les paramètres de la fonction

EDIT : cas de test :

>>> evlist = eventfreq(1995,1)
>>> len(evlist)
17
>>> evlist[0]
(datetime.date(1995, 1, 1), 5)
>>> evlist[14]
(datetime.date(1995, 1, 15), 1)

EDIT : Un autre exemple d'entrée :

1332 477660 HONDA (AMERICAN HONDA MOTOR CO.) ACURA INTEGRA 1994 19940601 N 0 0 VISIBILITÉ:PARE-BRISE TUSTIN CA JH4DC4359RS 19950112 19941112 1 PROBLÈMES DE FENÊTRE. *AK VOQ

La date est indiquée en gras. Je l'ai déjà au format datetime.date (module datetime importé) et elle est au même endroit dans chaque entrée. J'ai besoin d'une liste contenant des paires (datetime.date(year,month,day) , # of times the same année y mois apparaissent dans le fichier)

0voto

Benjamin Points 3269

En supposant que vous savez comment extraire les dates entières de votre fichier dans une liste :

import datetime
dates = [19940903, 19940907, 19940801, 19950701, 19950702]
formated_dates = [datetime.datetime.strptime(str(i), '%Y%m%d') for i in dates]
year_month_pairs = [(i.year, i.month) for i in formated_dates]
unique = set(year_month_pairs)
counts = [(i, year_month_pairs.count(i)) for i in unique]

0voto

Subbdue Points 765

En supposant que fielddict() renvoie une liste de tuples, comme ceci :

[('m1', datetime.date(1995, 1, 1), 'y1', 'c1', 'i1'),
('m2', datetime.date(1995, 1, 15), 'y2', 'c2', 'i2'),
('m3', datetime.date(1995, 1, 1), 'y3', 'c3', 'i3')]

Votre fonction eventfreq() pourrait être :

def eventfreq(year, month):
    F=fieldict('DOT1000.txt')
    #Get a list of datetimes matching year and month
    lst = [i[1] for i in F if((i[1].year == year) & (i[1].month == month))]
    #return a list of tuples (datetime, count)
    return [(i, lst.count(i)) for i in set(lst)]

Maintenant vos testcases devraient fonctionner comme vous l'attendez.

-1voto

Emmanuel Points 4510

Ok, j'ai essayé d'obtenir la date à partir du 1er mot de la ligne au format correspondant. %Y%m%d (voir ce lien pour plus de détails), voici ce qu'il donne :

>>> dict_dates = {}
>>> from datetime import datetime
>>> for line in open(r'D:\DATA\FP12210\My Documents\Temp\Python\Dates.txt'):
    for word in line.split():
        try:
            # Try to convert
            date = datetime.strptime(word, '%Y%m%d')
            # Conversion succeeded
            dict_dates[date] = dict_dates.get(date, 0) + 1
            break
        except:
            pass

>>> dict_dates
{datetime.datetime(1994, 6, 1, 0, 0): 1, datetime.datetime(1992, 6, 6, 0, 0): 1}
>>> 

J'ai créé un fichier avec les 2 lignes que vous avez fournies.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X