Daten importieren und Graphisch darstellen

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
Keranie
User
Beiträge: 9
Registriert: Dienstag 31. März 2015, 09:01

Hallo,

ich bin ein völliger Neuling im Programmieren und mit Phython.
Vielleicht gibt es auch schon Einträge hierzu und ich sehe den Wald vor lauter Bäumen nur nicht.

- Ich lese eine Datei ein in diesem Format:
- und trenne die Spalten mit delimiter

f = csv.reader(open('datenname','r'), delimiter=';')

blabla; blabla; blaba;
01.12.2010 01; 0.70; 5.00; 2.38; 33.20; -; -; 1.51; 15.37;


- in der ersten Zeile sind die Spaltennamen, die ich bei der Graphik nur für die Legende Brauche
Wie mache ich dass es erst ab Zeile 2 die Spalten für meine Graphik nutzt? :shock:

Nun möchte ich das Datum (Spalte 1) ins Datum format umwandeln: ???

Code: Alles auswählen

Zeit = []
for date in data:
	Zeit.append(datetime.datetime.strftime(str(int(date)),"%d.%m.%Y %H")) 
Zeit = array(Zeit)
Das Ziel letzten Endes soll sein, dass ich das Datum als x-Achse und eine jeweils andere Spalte als y-Achse mir mit import matplotlib.pyplot as plt plotten lassen will.

Wäre mega wenn mir jemand helfen könnte... bin überfordert :roll: :mrgreen:
Zuletzt geändert von Anonymous am Dienstag 31. März 2015, 09:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Keranie: Du müsstest aus dem `csv.reader` halt erst die erste Zeile auslesen (`next()`-Funktion) und dann den Rest zum Beispiel in eine Liste einlesen.

Oder Du verwendest `numpy`-Funktionen zum Einlesen von CSV-Dateien.

Bei Zeitreihen bietet sich eventuell auch das `pandas`-Modul an.

Ansonsten wandelt man Zeichenketten mit der `datetime.datetime.strptime()`-Methode in `datetime`-Objekte um. `strftime()` ist für die andere Richtung — `datetime` nach Zeichenkette.
Keranie
User
Beiträge: 9
Registriert: Dienstag 31. März 2015, 09:01

Hi,

hmm.. ok. ja von dem panda modul hab ich auch schon gelesen, aber wenn das skript erstmal läuft kann man es vielleicht immer noch ändern.Vielen Dank auf jeden Fall schon mal.
Es sieht jetzt inzwischen so aus:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import csv 
import numpy as np  
from numpy import *                
from datetime import datetime # datetime Funktionen fuer Zeiten 
import matplotlib.pyplot as plt


df = open('dateiname','r')
data=csv.reader(df)

k=0
nc=0
CID=49 #stations of interest 2-98

li=df.readlines() #read first line with names

xtime=[] #create empty list


for line in df: # do the following commands  
 data=csv.reader(line.splitlines(),delimiter=';') #variable data 
if k == 0:
  for elements in data: 
   yname=str(elements[CID]) # select name of the station of interest, sodass erste Zeile nicht fürs plotten ??
else:
    for elements in data:
        xtime=str(elements[0])    
        xtime.append(datetime.datetime.strftime(str(int(date)),"%d.%m.%Y %H"))  # in datetime Objekte umgewandeln ?
        xtime=array([xtime])
        y=str(elements[CID]) # select discharge value x of line k
        y.append(y)
        y=array([y])

#Plots
plt.plot(xtime, y)
plt.ylabel('Zeit')
plt.xlabel ('Abfluss')

show()
Mein Problem ist ist jetzt, dass die Listen die ich erzeuge und mir dann plotten lassen möchte leer sind.
Aber ich versteh nicht warum, ich habe doch über meine else funktion und mit append sie gefüllt?...anscheinend nicht :?:

Wäre cool, wenn mir nochmal jemand hilft!!! :)
Zuletzt geändert von Anonymous am Dienstag 31. März 2015, 21:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Keranie: Das ist so kaputt dass Du am besten noch mal komplett neu anfängst.

*Entwickle* das Programm Stück für Stück und teste regelmässig ob das Teilprogramm bis dahin das macht was es soll. Du könntest mit einem Programm anfangen das einfach nur die Zeilen der Datei über einen `csv.reader()` einliesst und mit `print()` ausgibt. Testen ob das funktioniert, falls nicht korrigieren bis es funktioniert.

Dann könntest Du die Kopfzeile überlesen und entweder an einen Namen binden oder verwerfen, je nach dem ob Du den Inhalt noch brauchst. Die `next()`-Funktion erwähnte ich ja schon. Nicht ohne Grund. Wieder testen und erst über weitere Funktionalität nachdenken wenn das funktioniert.

Dann könntest Du das Programm so erweitern das aus den Zeilen die Informationen heraus gepickt und ausgegeben werden, die am Ende geplottet werden sollen. Testen. Erst weitermachen wenn das funktioniert.

Dann könntest Du die Informationen in die entsprechenden Datentypen umwandeln bevor sie ausgegeben werden. Wieder testen. Erst weitermachen wenn das funktioniert.

Dann könntest Du die Daten die nun in der richtigen Form vorliegen plotten.

Programmieren funktioniert nicht in dem man sich den Code zusammenrät. So sieht aber ein Grossteil des Quelltextes aus. Da wurde offensichtlich nicht darüber nachgedacht welchen Datentyp die Werte haben und welche Operationen sich daraus ergeben — und welche ganz sicher nicht. Zeichenketten haben zum Beispiel keine `append()`-Methode. Wenn man also eine Zeichenkette an einen Namen bindet, dann kann man über diesen Namen in der nächsten Quelltextzeile ganz sicher keine `append()`-Methode aufrufen.

Sternchen-Importe sollte man vermeiden. Da weiss man am Ende nicht mehr welcher Name eigentlich aus welchem Modul kommt. Man riskiert Namenskollisionen. Insbesondere bei Modulen wie `numpy` die *sehr* viele Namen enthalten:

Code: Alles auswählen

In [11]: import numpy as np

In [12]: len(dir(np))
Out[12]: 571
Dateien die man öffnet sollte man auch wieder schliessen. Am einfachsten und sichersten geht das wenn man `open()` zusammen mit der ``with``-Anweisung verwendet.

Namen sollten nicht aus kryptischen Kürzeln bestehen sondern dem Leser vermitteln was der Wert hinter dem Namen im Kontext des Programms bedeutet.
Antworten