werte aus csv file mit if condition abfragen verwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

Hallo
mein problem sollte einem profi wohl keine probleme machen aber als anfänger komme ich nicht wirklich auf eine lösung
also:
ich habe eine .csv datei mit tageswerten für temperaturmessungen nun möchte ich den mittelwert der temperatur pro monat berechnen. also summe temperatur /anzahl tage
kann ich das machen ohne immer alle tage einzeln zu rechnen und ausgegeben zu bekommen
[code =py]
li1=[]

file = csv.reader(open("mean_test.csv", "rb"),delimiter =";" )

for row in file:

monat = float(row[1])
temp_a = float(row[2])
#monat januar
if c == 1:

temp = li1.append(a)

jan_mean = sum(li1)/30
print

# monat februar
elif c ==2:
temp = li1.append(a)
feb_mean = sum(li1)/28
print mean


#und so weiter



else:
continue
[/code]
der code sollte also durchlaufen erkennen welcher monat ist und dann den mittelwert aus den dazugehörigen messungen rechnen und mir diesen wert wieder ausgeben momentan bekomme ich es nur hin das mir für jeden tag ein eigener mittelwert ausgegeben wird, (d.h nach dreissig durchgängen habe ich meinen wert aber das kanns ja nicht sein) :?

vielen dank für tipps
a
der späte wurm ...
BlackJack

@ali2go: Das da gibt einen `NameError`, weil `c` nirgends definiert wird. Und `a` auch nicht.

Wenn in den Eingabedaten ein Monat maximal einmal vorkommen kann, könnte man die Daten in ein Dictionary stecken, dass Monat auf eine Liste mit Temperaturwerten abbildet.

Falls mehr als ein Jahr in so einer Datei steht, die Monate aber in Blöcken in der Datei stehen, bietet sich `itertools.groupby` an.

Auf jeden Fall solltest Du das Tutorial in der Dokumentation durcharbeiten, um die Grunddatentypen besser kennen zu lernen.

Warum wandelst Du den Monat in eine Fliesskommazahl um? Können da wirklich Werte mit Nachkommastellen vorkommen?

`li1` ist ein ziemlich nichtssagender Name und `file` ist der Name des eingebauten Dateityps, den sollte man nicht überschreiben. Es handelt sich ja ausserdem noch nicht mal um ein Dateiobjekt, sondern um einen Reader, oder eben ein "iterable" von `row`-Exemplaren. Also wäre `rows` auch ein passender Name.

Edit: Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import with_statement
import csv
from collections import defaultdict


def main():
    month2temperatures = defaultdict(list)
    with open('mean_test.csv', 'rb') as temperature_file:
        for row in csv.reader(temperature_file, delimiter=';'):
            month, temperature = int(row[1]), float(row[2])
            month2temperatures[month].append(temperature)
    
    for month, temperatures in sorted(month2temperatures.iteritems()):
        print '%2d: %f' % (month, sum(temperatures) / len(temperatures))


if __name__ == '__main__':
    main()
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@BlackJack:
Ja das klappt, danke.
der skript oben war nur das ein sketch indem ich meine vorgehensweise darstellen wollte
dank deiner hilfe siehts jetzt aber viel sauberer aus

nur woher soll man denn als anfänger sämtliche funktionen kennen
ich weiss schon dass es lists tupels und so weitergibt und auch datentypen sind mir ein begriff aber das alles miteinander zu verbinden klappt halt eher schlecht bis gar nicht...aber wird schon
dein tip mit den itertools sieht gut aus
aber was ich jetzt machen will also jedem jahr (40) eine liste mit den gerechneten monatswerten zuweisen...
ich werds mal auf meine weise probieren aber für jeden tipp bin ich nachwievor dankbar
sowie ich das sehe lernt programmieren nur über try and error
oder wie siehst du das?

gruss
a
der späte wurm ...
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

@ blackjack:
achso vergessen wozu brauch ich den diese __name =='__main__!
geschichte nach meinen bescheidenen kenntnissen kann ich funktionen über def() erstellen und über den namen aufrufen...? :?:
der späte wurm ...
Antworten