Effitiente Datenverarbeitung/Auswertung unter Windows mit Python, es geht!

Gast #5292512
Lesenswert?

Hallo,

Hier geht es tatsächlich nicht um ein Problem, sondern darum wie leicht 
man Daten effitient per Script verarbeiten kann.
Ich möchte Messdaten effitient verarbeiten, und habe sie vom Messgerät 
in der Form:
1
#1,01-Jan-2003 01:30:45,0                 
2
Time,Ampl
3
0,-170.969
4
3.0517578,-89.8264
5
6.1035156,-86.5723
6
9.1552734,-86.2506
7
12.207031,-85.7201

Diese möchte ich zunächst mal mit Exel sowie Scilab unproblematisch zur 
Diagrammerstellung öffnen können.
Dazu muss in Exel 2013 unter Datei->Optionen->Erweitert der Haken 
"Trennzeichen von Betriebssystem übernehmen." abgewählt werden.
Als Dezimalzeichen wähle Ich einen ".".
Somit können gewünschte Diagramme nacher korrekt dargestellt werden.

Im nächsten Schritt geht's unter 
Start->Systemsteuerung->Programme->Standardprogramme->Dateityp óder 
Protokoll einem Programm zuordnen.
CSV wählen, ->Programm ändern->Die Datei "Konverter.bat" wählen.

Diese enthält folgenden Inhalt:
1
C:\1\Messungen\Scilab\Konverter.py %1
Der Dateipfad muss gegebenenfalls angepasst werden.

Es wird die Datei "Konverter.py" aufgerufen und ihr als 
Übergabeparameter der Pfad der Gewünschten CSV-Datei übergeben.

Duch das Python-Skript wird der Dateiinhalt konvertiert sodass er 
einfach in Scilab/Exel weiterverarbeitet werden kann.

Das Python-Skript enthält folgendes:
1
import os
2
import sys
3
print (sys.argv)
4
l1=[]
5
for elem in sys.argv:
6
    l1.extend(elem.strip().split("\\"))
7

8
leng=len(l1)
9
print(l1,"\n")
10
print(leng,"\n")
11
with open ("Erg.csv","w") as ziel :
12
    with open(l1[leng-1],"r") as datei :
13
        print ("Inhalt :")
14
        z=0
15
        for i in datei :
16
            z=z+1
17
            zeile = i.strip()
18
            inhalt = zeile.split(",")
19
            in1=inhalt[0].split(".")
20
            in2=inhalt[1].split(".")
21
            if z>5:
22
                if len(in1)>1 and len(in2)>1:
23
                    ziel.write("{0}.{1};{2}.{3}\n".format(in1[0],in1[1],in2[0],in2[1]))
24
                elif len(in1)>1:
25
                    ziel.write("{0}.{1};{2}.0\n".format(in1[0],in1[1],in2[0]))
26
                elif len(in2)>1:
27
                    ziel.write("{0}.0;{1}.{2}\n".format(in1[0],in2[0],in2[1]))
28
                else:
29
                    ziel.write("{0};{1}\n".format(in1[0],in2[0]))
30

31
os.system("C:\\1\\Messungen\\Scilab\\Auswertung.sci")")

Hierbei wird der übergebene Pfad zunächst getrennt, damit der Dateiname 
entnommen werden kann.
In dieser Datei werden entsprechend "," durch "." ersetzt.
Es wird auch überprüft ob nicht etwa ein Eintrag keine Nachkommastelle 
hat. Deshalb die if-Abfrage.
Die erzeugte Datei wird nun in Exel automatisch in zwei Spalten 
geöffnet.

Die konvertierte Datei wird im Pfad der gewählten Datei als Erg.csv 
gespeichert.
Abschließend wird dir Datei "Auswertung.sci" geöffnet.
Dadurch wird automatisch Scilab mit der konvertierten Datei gestartet. 
Diese kann nun durch Drücken auf F5 ausgewertet werden.
--> Habt ihr eine Idee wie man sich dass sparen kann?

Darin könnte man sich z.b. das Zeitsignal eine FFT oder die 
Autokorrelation der gewählten Datei ansehen...
z.b. so
1
M=csvRead('Erg.csv',";")
2
Achse = M(:,1)
3
Ampl = M(:,2)
4
[c,ind]=xcorr(Ampl,"biased")
5
F=fft(Ampl)
6
subplot(221)
7
plot(Achse,Ampl)
8
title ("Signal druch XI44")
9
xlabel ("Zeitverlauf")
10
ylabel ("Amplitude")
11
legend ("Signal(t)")
12
subplot(222)
13
plot(ind,c)
14
title ("Autokorrelation")
15
xlabel ("dt")
16
ylabel ("Amplitude")
17
legend ("Autokorr")
18
subplot(223)
19
plot(F)
20
title ("FFT")
21
xlabel ("Frequenz")
22
ylabel ("Amplitude")
23
legend ("FFT")

Nun seht ihr das gewünschte...

Ich wäre dankbar für Anregungen und einen Tip wie die Frequenzachse der 
FFT richtig skaliert wird...
oder das gewünschte einfacher erreicht werden kann...

Grüße,
Matze
#5292637
Lesenswert?

Matze schrieb:
> Ich wäre dankbar für Anregungen und einen Tip wie die Frequenzachse der
> FFT richtig skaliert wird...

Die FFT erzeugt Frequenzpunkte der Breite "Samplingfrequenz/fftpoints", 
und das bis zur Nyquistfrequenz. Mache sowas mit FS=Samplingfrequenz und 
fft_points=Anzahl FFT Punkte:

f=(0:(FS/fft_points):(FS)-(FS/fft_points));

Und nimm das dann auf die x-Achse

"F=fft(Ampl)" + "plot(F)" würde bei mir in Octave allerdings nicht 
funktionieren, weil die FFT komplexe Werte liefert, ich schreibe 
stattdessen den Betrag, außerdem verwende ich einen Vorfaktor, der dafür 
sorgt dass die Amplitude eines Signales unabhängig von der Anzahl der 
FFT Punkte ist:

spectrum=(2/fft_points).*(abs(fft(Y,fft_points)));

Plotten tue ich dann in dB:

plot(f,20*log10(spectrum))

> oder das gewünschte einfacher erreicht werden kann...

Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert, 
ich mache sowas in Octave und kann dort Messdaten in verschiedenen 
Formaten (S2P, CSV) direkt mit "dlmread" einlesen. Einfacher geht es 
eigentlich nicht.
#5292662
Lesenswert?

Bernhard S. schrieb:
> Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert,
> ich mache sowas in Octave und kann dort Messdaten in verschiedenen
> Formaten (S2P, CSV) direkt mit "dlmread" einlesen.

Er ist Python-Anfänger. Warte erstmal bis er die mitgelieferten 
Batterien¹ findet, auspackt und einlegt ;-)


________
¹) 
https://www.python.org/dev/peps/pep-0206/#batteries-included-philosophy
Gast #5292670
Lesenswert?

@Bernhard S.
> FFT
Danke dass werd ich versuchen :)

Bernhard S. schrieb:
> Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert,
> ich mache sowas in Octave und kann dort Messdaten in verschiedenen
> Formaten (S2P, CSV) direkt mit "dlmread" einlesen. Einfacher geht es
> eigentlich nicht.

Also im Prinzip hat der Nutzer csv Dateien.
Diese klickt er mit Doppelklich an, sie werden so konvertiert dass sie 
nun leicht mit SciLab und Exel geöffnet werden können.
Die Kopie wird als Erg.csv im Verzeichniss der Ursprungsdatei 
gespeichert.

Das Skript zur Auswertung der konvertierten Datei wird in Scilab 
geöffnet, zusätzlich befindet sich Scilab im richtigen verzeichniss und 
durch nur einen Tastendruck auf F5 wird das zu den Messdaten gehörige 
Script ausgeführt.
Als Nebenergebniss lässt sich die Datei Erg.csv auch in Exel nun 
unkompliziert weiterverarbeiten.

Dass Auswerteskript, das Python und Batch-File können an jedem 
beliebigen Ort auf dem PC Liegen.
Allein durch Doppelklich auf die Messdatendatei und einen Tastendruck 
auf F5 erhält der Nutzer alle gewünschten diagramme jeder beliebigen 
csv-Messdatei :)

Wenn ich nur wüsste wie ein Script bei laden in Scilab automatisch 
gestartet werden kann... dazu hab ich nichts gefunden?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren