J'ai un fichier csv avec trois colonnes différentes, à savoir Année, Mois et Jour. Si je l'ai imprimé, ce sera quelque chose comme ci-dessous:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Le fichier csv et la ligne sont donc des listes. Je souhaite calculer le nombre moyen de jours entre chaque date à partir de cet ensemble de données. J'essaye d'utiliser:
from datetime import date
for value in csv_reader:
dates = date(int(value))
differences = [(dates[i]-dates[i-1]).days for i in range(1, len(dates))]
print(float(sum(differences))/len(differences))
Mais cela a renvoyé une erreur indiquant que
csv_reader = [['2016', '6', '22'], ['2016', '10', '2'], ['2016', '11', '1'], ['2016', '11', '3'], ['2016', '11', '3'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '12', '2'], ['2016', '12', '12'], ['2016', '12', '22'], ['2016', '12', '22'], ['2017', '1', '11'], ['2017', '3', '11'], ['2017', '3', '11'], ['2017', '5', '12'], ['2017', '5', '12'], ['2017', '5', '12']]
et je soupçonne si mon code est en fait correct. Le résultat attendu doit calculer la somme de la différence entre chaque date, puis divisée par le total des différences, ce qui renvoie la moyenne des jours. Alors, l'un de vous pourrait-il donner des conseils sur la façon d'effectuer cette tâche?
4 Réponses :
Vous ne pouvez pas simplement convertir cette chaîne '2016,6,22' en int. Vous devez supprimer les virgules avant de passer une chaîne dans la fonction int ()
J'essaie d'utiliser dates = date (int (row.strip (".,:;?! '[] ()")) Mais cela n'aide pas vraiment.
Essayez de changer date (int (valeur)) en date (int (value.replace (',', ''))) .
Il retourne AttributeError: l'objet 'list' n'a pas d'attribut 'replace'
Oh, d'accord, maintenant que vous avez édité votre question, cela semble normal. quel est le résultat attendu?
Nous avons donc
total = 0
for i in range(len(csv_reader)-1):
total += abs((date(*[int(d) for d in csv_reader[i]]) - date(*[int(d) for d in csv_reader[i+1]])).days)
>>> total
324
>>> total / len(csv_reader)
18
d'abord, pour obtenir une date valide de disons, le premier élément, vous devez convertir la chaîne en int, et seulement ensuite appeler date :
date(*[int(d) for d in csv_reader[0]]) - date(*[int(d) for d in csv_reader[1]])
Et vous devez avoir une instance de date pour chaque 2 dates et les soustraire:
date(*[int(d) for d in csv_reader[0]])
Ensuite, vous obtenez un objet timedelta , qui a .days . Parfois, il sera négatif, vous devrez donc utiliser la valeur absolue, avec abs .
Après avoir additionné tous ces jours, vous devez faire la moyenne, relative au nombre d'éléments.
Dans l'ensemble, c'est la boucle dont vous avez besoin:
csv_reader = [['2016', '6', '22'], ['2016', '10', '2'], ['2016', '11', '1'], ['2016', '11', '3'], ['2016', '11', '3'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '12', '2'], ['2016', '12', '12'], ['2016', '12', '22'], ['2016', '12', '22'], ['2017', '1', '11'], ['2017', '3', '11'], ['2017', '3', '11'], ['2017', '5', '12'], ['2017', '5', '12'], ['2017', '5', '12']]
Convertit la liste de str en liste de dates
avg_days = sum(delta_days)/len(delta_days)
Compressez deux listes de dates avec décalage pour 1 jour et calculez l'horaire des jours:
delta_days = [(d_t[0] - d_t[1]).days for d_t in list(zip(dates[1:],dates))]
La moyenne sera une opération simple
dates = [datetime.date(*[int(d) for d in ds]) for ds in sortedtime]
Qu'est-ce que
csv_reader?