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
Daten auslesen
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.
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.
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.
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.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Lastesel!
mfg
Gerold
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
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Bei einem File Object: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
Code: Alles auswählen
for zeile in datei.readlines():
print zeile
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Lastesel!lastesel hat geschrieben:jetzt hab ich nur noch das Problem die Zeilen auseinanderzufummeln
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()
>>>
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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...
Tut mir Leid, für die vielen Fragen, aber ich bin blutiger Programmieranfänger...
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Auch mit ``split()``: http://docs.python.org/lib/string-methods.html#l2h-262lastesel hat geschrieben:Wie läuft das denn bei Spalten die durch Leerzeichen Getrennt sind?
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Code: Alles auswählen
date, time, value = line.split(" ")
Man munkelt, dass man dafür auch das ``csv``-Modul mit einem eigene Dialekt nutzen könnte Das hätte die imho angenehmere API
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.lunar hat geschrieben:Das hätte die imho angenehmere API
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
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
Lastesl
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.
Ohne dass Du ein Stueck Code postest ist es auch schwierig nachzuvollziehen, was Du da jetzt gemacht hast.
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
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
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
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
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"):
mit M[1][2] bekommst Du dann z.B. den Wert aus Reihe 2, Spalte 3.
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]]
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hast Du Dir mal a ausgeben lassen und angeguckt wie es aussieht? Wenn nein, tue das und voila, Du hast eine Zeile aus Deiner Matrixlastesel 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()
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.wenn ich es mit date, time, value = line.split(";") probiere dann spuckt er mir aus: ValueError: too many values to unpack