Pandasのデータフレームにカラム数の異なるcsvを取り込みたいと考えております。
具体的にはオシロスコープで取り込んだデータをpandasに取り込みpyplotでグラフを表示したいのですが、オシロスコープの仕様上以下のようなcsvが保存されます。
csv
1ModelName,DS-**** 2Acquisition Time,2019/01/** **:**:** 3Time/div(second),0.2 4Delay(second),-0.8 5Delta(second),0.00002 6Acquisition Mode,Normal 7Trigger Address,10001 8CH1 Volt/div,1 9CH2 Volt/div,10 10CH3 Volt/div,10 11CH4 Volt/div,10 12CH1 Offset,-1 13CH2 Offset,-30 14CH3 Offset,-5.0 15CH4 Offset,0 16Points,100002 17Ch1 ,Ch2 ,Ch3 ,Ch4 181.0625,0.31250,, 191.125,0.31250,, 201.09375,0,, 211.0625,0.31250,, 221.09375,0.31250,, 231.09375,0.31250,, 241.0625,0.31250,, 251.09375,0,, 261.0625,0.31250,, 271.09375,0,, 281.09375,0.31250,,
この時、pandasのread_csvを実行すると、カラムが一致しませんといったエラーが出るため、正常に取り込むことができません。このため、以下のように型番や時間の後にカンマを付けてカラム数がすべての列で一致するようにcsvに手で書き換えています。
csv
1ModelName,DS-****,, 2Acquisition Time,2019/01/** **:**:**,, 3... 4Ch1 ,Ch2 ,Ch3 ,Ch4 51.0625,0.31250,, 61.125,0.31250,,
しかし、これでは大量にオシロスコープから保存されるデータを効率よく解析することができません。
そのため、自動でカラム数を一致させる、もしくはcsvファイルを列で分割するようなプログラムがあれば良いと考えておりますが、解決策が出てきません。
現在のコードは以下の通りです。
python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4 5params = {"model_name": "ModelName", "measured_time": "Acquisition Time", "tdelta": "Delta(second)", 6 "data_points": "Points"} # ほしいパラメータとグラフ上のパラメータを対応 7enable_channel = [3] 8data_start_columns = 17 # 9 10file_name = 'file.csv' 11 12df = pd.read_csv(file_name, header=None, nrows=data_start_columns) 13 14for items in params: # 各種パラメータ表示 15 # print(items) 16 print(df[df[0] == params[items]].iat[0, 0] + ' : ' + df[df[0] == params[items]].iat[0, 1]) 17 18# 時間単位はms 19data_points = float(df[df[0] == params['data_points']].iat[0, 1]) 20time_delta = float(df[df[0] == params['tdelta']].iat[0, 1]) * 1000 21time_start = 0 22time_end = data_points * time_delta 23 24data_start_columns -= 1 # インデックスは0から 25enable_channel = list(map(lambda x: x-1, enable_channel)) 26 27 28# データ本体の処理 29df = pd.read_csv(file_name, skiprows=data_start_columns) 30# df = df.reset_index() 31 32df['time'] = pd.DataFrame(np.arange(time_start, time_end, time_delta), columns=['time']) # 時間軸 33 34for channel in enable_channel: 35 df.plot(x='time', y=df.columns.values[channel]) 36plt.xlabel('time[ms]') 37plt.ylabel('Volt[v]') 38plt.show() 39plt.savefig('hoge.png')
また、pyplotではplotを複数回行うと重ね書きができるようですが、pandasのplotを利用しているからか重ね書きができず、複数チャンネルを同時に一枚のグラフに書き出すことができず、困っております。
どなたかご教授のほどよろしくおねがいします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/11 12:01