Daten auslesen

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.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Hallo, ich habe ein Problem mit dem auslesen von Daten aus einer Messdatei die in etwa so aussieht:

Spalte1:Spate2:Spalte3:...
Datum Uhrzeit Zahlenwert ...

Bei Datum steht das Datum in einer Spalte, bei Uhrzeit die Uhrzeit in der Form: 11:20:40.
Ich will nun die Daten mit Datum und Uhrzeit auslesen. D.h. Nur ganz Bestimmte Columns aus den Messdaten. Die Uhrzeit sollte Idealerweise auf Stunden reduziert werden.

Vielen Dank,
lastesel
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

und was genau ist jetzt die Frage? Was hast Du denn schon?

Was mich irritiert: warum hast Du in der ersten Zeile den Doppelpunkt als Trennzeichen, in der zweiten aber nicht? Ist es jetzt der Doppelpunkt oder ist es ein anderes Zeichen? Wenn es der Doppelpunkt ist waere das natuerlich sehr ungluecklich, da Deine Uhrzeit ja auch mit Doppelpunkt getrennt ist.

Kannst Du nicht mal ein paar Zeile mit realen Werten posten? So ist das irgendwie arg verwirrend, finde ich.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Die Daten schicke ich gleich noch.
Die Frage ist A: Wie kann ich von der Datei nur die von Benötigten Spalten einlesen (mir würde schon ein allg. Befehl reichen dann kann ich selber weiter schauen)

und B: Wie kann ich die Spalte Uhrzeit von hh:mm:ss auf nur hh reduzieren.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

kommt halt arg drauf an, wie die Daten wirklich genau aussehen und getrennt sind. Im einfachsten Fall reicht da aber ja ein einfacher Stringsplit vollkommen aus. Erst einer mit dem Trennzeichen der Spalten, und dann nur noch auf die Uhrzeit angewendet ein Split auf den Doppelpunkt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Lastesel!

Code: Alles auswählen

>>> s = """2004-01-20;20:30:00;5000
... 2005-03-30;14:15:00;6000"""
>>> for line in s.splitlines():
...     date, time, value = line.split(";")
...     print date
...     print time, time.split(":")[0]
...     print value
...     
2004-01-20
20:30:00 20
5000
2005-03-30
14:15:00 14
6000
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Danke, jetzt hab ich nur noch das Problem die Zeilen auseinanderzufummeln, aber ich komm gerade nicht an die Daten ran --> nacher dann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lastesel hat geschrieben:Danke, jetzt hab ich nur noch das Problem die Zeilen auseinanderzufummeln, aber ich komm gerade nicht an die Daten ran --> nacher dann
Bei einem File Object:

Code: Alles auswählen

for zeile in datei.readlines():
    print zeile
Oder was meintest Du?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lastesel hat geschrieben:jetzt hab ich nur noch das Problem die Zeilen auseinanderzufummeln
Hallo Lastesel!

Code: Alles auswählen

>>> f = file(r"daten.txt", "rU")
>>> for line in f:
...     line = line.rstrip()
...     if line:
...         print line
...     
2004-01-20;20:30:00;5000
2005-03-30;14:15:00;6000
>>> f.close()
>>>
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Oh, da hab ich gerade Müll geschrieben, ich meinte natürlich die Spalten, klar. Wie läuft das denn bei Spalten die durch Leerzeichen Getrennt sind?
Tut mir Leid, für die vielen Fragen, aber ich bin blutiger Programmieranfänger...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lastesel hat geschrieben:Wie läuft das denn bei Spalten die durch Leerzeichen Getrennt sind?
Auch mit ``split()``: http://docs.python.org/lib/string-methods.html#l2h-262

mfg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 13. Juni 2008, 13:41, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

date, time, value = line.split(" ")
lunar

Man munkelt, dass man dafür auch das ``csv``-Modul mit einem eigene Dialekt nutzen könnte ;) Das hätte die imho angenehmere API ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Das hätte die imho angenehmere API ;)
Wobei ich zugegebenermaßen ``csv`` nicht so sonderlich gelungen finde. Das ist mir etwas zu Low-Level und ich muss oft die Daten nochmal umwandeln, damit ich auf sie via Spaltenname zugreifen kann. Auch Unicode ist nicht so die Sache von ``csv`` gewesen, wenn ich mich richtig erinnere.

Das es Dialekte unterstützt und Quotings respektiert wohl die praktischte Sache an dem ganzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Bin jetzt so weit das ich den loadtxt() Befehl verwende. Das Problem ist jetzt nur noch die ersten 2 Spalten auszulesen. Die erste ist das Datum in der Form DD.MM.YYYY die Zweite die Uhrzeit in der Form hh:mm:ss. Wie kann ich dies machen? In den Syntax von loadtxt kann man ja so was wie converters={0:datestr2num) schreiben. Das bringt aber nicht den gewünschten Erfolg.
Lastesl
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

hm, was an dem was oben steht klappt denn nicht? Das mit 'split' gilt doch nachwievor und waere ne einfach funktionierende Loesung.

Ohne dass Du ein Stueck Code postest ist es auch schwierig nachzuvollziehen, was Du da jetzt gemacht hast.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Das Problem ist das ich die Daten als Matrix brauche, so das ich sie Später weiter verwenden kann.
Erstmal die Daten:
YYYYMMDD;Uhrzeit;ta_w;Ta (°C);Tf_w;Tf (°C);v (m/s);WR (°);Q (W/m²);N (mm);Vp (hPa);VPmax (hPa);RH (%);Pa (hPa);Vmax (m/s);Bat
01.05.2008;00:10:00;1.04;10.2;1.03;6.7;3.4;162;0;0;7.5;12.5;60;968;4.01;14.3
01.05.2008;00:20:00;1.04;10.3;1.03;6.7;3.9;160;0;0;7.4;12.5;59;968;4.97;14.3
01.05.2008;00:30:00;1.04;10.3;1.03;6.8;4.2;163;0;0;7.5;12.5;60;968.1;5.37;14.3
01.05.2008;00:40:00;1.04;10.1;1.03;6.7;5.1;167;0;0;7.5;12.4;61;968.2;6.04;14.3
01.05.2008;00:50:00;1.04;10.3;1.03;6.6;4.4;182;0;0;7.3;12.5;58;968.3;5.97;14.3
01.05.2008;01:00:00;1.04;10.4;1.03;6.6;4.1;181;0;0;7.2;12.6;57;968.3;4.58;14.3

Die muss ich jetzt auslesen, die Zeit auf stunden rduzieren, so das ich dann den Stundenmittelwert von den Messdaten bilden kann (und dann vieleicht auch ihrgendwann plotten).

Momentan sieht der Code so aus:

data = loadtxt("dateiname.csv", delimiter=';', skiprows = 1, converters={0,datestr2num})

skiprows brauche ich da oben die Namen stehen und ich noch nicht wieß wie ich die Spalten den Namen zuordnen kann.

So hoffe das reicht,
vielen danke,
ein waschechter Anfänger
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

Ach ja, das mit dem Splitbefehl habe ich auch Ausbrobiert. Problem hier ist das er mir das Dokument zwar Zeilenweise trennt und die getrennte Zeile dann ausspuckt, ich dies aber nicht in eine Matrik schreiben kann.
Das gnaze lief etwas so:
fobj = file('dateiname', 'r')
for line in fobj:
a = line.split(";")
fobj.close()

wenn ich es mit date, time, value = line.split(";") probiere dann spuckt er mir aus: ValueError: too many values to unpack
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

auch ich bin ziemlicher Anfaenger :)

Ich kenn jetzt dieses loadtxt nicht. Aus welchem Modul ist denn das? Da wuerde es z.B. helfen wenn Du nicht mit "from xyz import *" arbeiten wuerdest sondern einfach nur mit "import xyz", dann steht in Deinem Codeschnipsel naemlich drin "data = xyz.loadtxt(...)" und wir koennten sehen aus welchem Modul das stammt.

Ansonsten ist das doch wunderbar ne Aufgabe fuer Listen und split. Schau Dir doch erstmal nochmal die ganzen Dokus zu normalen Listen an. Aus Listen laesst sich ja wunderbar ne Matrix machen, indem jede Zeile eine Liste ist und die wiederum alle in einer weiteren Liste stecken.

Beispiel (aus dem Buch "Learning Python"):

Code: Alles auswählen

M = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
mit M[1][2] bekommst Du dann z.B. den Wert aus Reihe 2, Spalte 3.
lastesel
User
Beiträge: 22
Registriert: Freitag 13. Juni 2008, 11:39

das ist aus dem scipy packet
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lastesel hat geschrieben:Ach ja, das mit dem Splitbefehl habe ich auch Ausbrobiert. Problem hier ist das er mir das Dokument zwar Zeilenweise trennt und die getrennte Zeile dann ausspuckt, ich dies aber nicht in eine Matrik schreiben kann.
Das gnaze lief etwas so:
fobj = file('dateiname', 'r')
for line in fobj:
a = line.split(";")
fobj.close()
Hast Du Dir mal a ausgeben lassen und angeguckt wie es aussieht? Wenn nein, tue das und voila, Du hast eine Zeile aus Deiner Matrix ;-)
wenn ich es mit date, time, value = line.split(";") probiere dann spuckt er mir aus: ValueError: too many values to unpack
Ist ja auch logisch, da in einer Zeile wesentlich mehr Einträge stehen, als Du atomare Variablen angegeben hast! Du speicherst nur drei Einträge, das split liefert Dir aber 11, wenn ich richtig gezählt habe.
Antworten