どうもこんにちは!まろんです!
今日は「CarScannerで貯めたログ、CSVでちゃんと残してグラフ化したい」という方向けに、うちで実際にやっているPython・JupyterLabでの整形〜グラフ化の手順を2026年版としてまとめ直します!
うちはHONDA FREED HYBRID(GB7)にOBDアダプタを挿しっぱなしにして、CarScannerで自動車速度や加速、燃費、EVのバッテリー残量、エンジンオイル温度、水温…といった自動車運転データをずっと記録しています。最初はCarScannerアプリの画面上でグラフを見て比較していたのですが、画面が小さくて見づらく、「どこで燃費を悪くしているのか」までもう少し踏み込んで分析したくなったのがこの作業を始めたきっかけです。Excelに落とし込めば楽かなと甘い考えでいたのですが、結果的にExcelではうまく処理できず、こちらのサイトに出会ってPythonに乗り換えました。今日はその時の手順を、今の目線で整理し直したものです。
この記事でできるようになること
先に結論です。CarScanner Pro(有料版)で書き出した生のCSVは、そのままだと時刻表記がバラバラでPIDごとに行が分かれた扱いにくい形をしています。この記事の手順を踏めば、次のところまでたどり着けます。
- CarScannerが吐き出す生のCSVを、日付・時刻つきの整然データ(1行=1秒のデータ)に整形する
- 速度・燃費・EVバッテリー残量などのPIDを、それぞれ列として並べたDataFrameにまとめる
- plotly_expressで折れ線グラフにして、CarScannerアプリの画面より広い視点で走行データを見る
私自身、この手順で219本分のログを整形し、後述する2本の記事(実測燃費3年分の分析・EVならない病の研究)に落とし込んでいます。この記事は、その土台になっている作業部分の解説です。
必要なもの
- PC(Windows or Mac)
- Python(JupyterLab, Pandas, plotly_express)
- OBD(On Board Diagnosis)アダプタとCarScanner Proで記録したCSVファイル
- プログラミングの基礎知識(なくても手順通りで動きますが、詰まった時に調べる根気は必要です)
ほとんどこちらのサイトで解説されているものを使用しています。手順の元ネタとして、まずはお礼を。
ScanTool OBDLink MX+(Bluetooth OBD2アダプタ・iOS対応)
この記事で整形しているCSVも、元はこのアダプタでCarScannerに記録したものです。iPhoneでもAndroidでも使えます。
Amazonで見る準備(Python環境を整える)
まずは、お手元にPCを用意します。最新のOSをインストールしたのちにPythonをググって利用規約等々に目を通し、内容に同意できれば同意。無理ならその時点で今回の作業は終了となります。
同意いただけた方は、PCにPythonをインストールします。Pythonをインストールした後は、Anacondaをググってこちらも利用規約等々に目を通し、同意できれば同意。同意できないならその時点で(ry
AnacondaはPandasやJupyterLabが入ったパッケージであり、今後もPythonを勉強するのであれば入れておいても損ではないと思います。
今回はJupyterLabで操作しますので、起動の際は「ターミナル」から「jupyter lab」と打ち込み実行するとJupyterLabが起動します。起動後はnotebook pythonを選択し、コードを記載しながら実行していけば経過を追いながら編集作業ができます! なお、アプリ側の画面デザインは細かく変わることがありますが、CSVを書き出す基本の流れ(記録→エクスポート→ファイル取り出し)自体は変わっていません。
OBDから取り出したCSVを整える
ここから本題です。上記サイトを参考に、まずはPandasでデタラメな順番でCSVに保存されたデータを整然データに整えていきます。整える際にPandasのDataFrameを使用します。
「Seconds」というfloat値で記載されたデータはUnix時間で変換すると日付はデタラメですが、時間(H)は合っていることに気がつくと思います。
そのため、「Seconds」列のデータをfloat値からint64値に変えてUnix時間に変換してあげます。変換した後のデータは「1970-01-01 hh:mm:ss」(hh=時,mm=分,ss=秒…記録された時間と一致してるはず)となるはずです。
このままだと1970-01-01というタイムスリップしたデータになるので、1970-01-01を記録した日付に置換してあげます。
あとは各PIDがColumnsになれば綺麗な表になります。ちなみにコードはかなり調べるのに時間がかかりましたが、途中でChatGPTを介入させたおかげで想定より早く終わりました。
使用したコードはこんな感じです(この部分は2026年時点でも変更していません。Pandasの基本APIだけで組んでいるので、今も同じように動きます)。
#Pandasのインポート
import pandas as pd
# OBDから取得したcsvファイルを読み取る( df_car_dataとしてますが、dfでもいいと思います。)
df_car_data = pd.read_csv('読み込むcsvファイルが保存されている場所のパス',sep = ';')
#[SECONDS]が時刻データになってないので変換させる処理
df_car_data['SECONDS']=df_car_data['SECONDS'].round(0).astype('int64')
df_car_data['時間']= pd.to_datetime(df_car_data['SECONDS'],unit = 's')
time={'datetime_str':df_car_data['時間']}
df=pd.DataFrame(time)
df['datetime']=pd.to_datetime(time['datetime_str'])
# このままだと1970-01-01なのでcsv作成時の年月日に置換(yyyy=年 mm=月 dd=日)
new_time=pd.to_datetime('yyyy-mm-dd')
df['datetime']=df['datetime'].apply(lambda x:x.replace(year=new_time.year,month=new_time.month,day=new_time.day))
df_car_data['日付']=df['datetime']
# 不要な列を削除
del df_car_data['SECONDS']
del df_car_data['Unnamed: 4']
del df_car_data['UNITS']
del df_car_data['時間']
#上記で整えた「日付」列と「PID」列の各値を列に取るDataFrameを作成
df_pivot = df_car_data.pivot_table(index='日付', columns='PID', values='VALUE')
#「日付」に対して1s毎の平均値にする
df_pivot = df_pivot.resample('1S').mean()
# データの結合
merged_df = df_pivot[df_pivot.columns[0]].to_frame()
for col in df_pivot.columns[1:]:
merged_df = merged_df.join(df_pivot[col], how='inner', rsuffix=f'_{col}')
#NaN値を0に置き換える
df_filled = merged_df.fillna(0)
#編集が終わったcsvの保存
df_filled.to_csv('保存先のパス')
前半戦のまとめ
以上、ChatGPTと独学でプログラミングした結果となります。無駄の多いコードかもしれませんが、MacBookAirでも処理に問題なくPCが落ちることもないのでこちらを採用しています。こんなコードが3週間程度で完成しました…時間はかかりました。
さて、ここまではCSVを整形すること、でしたので今度はグラフ化です。
整形したデータをグラフにする
グラフ化にはplotly_expressを使っています。使い方の骨組みは冒頭で紹介したサイトの元をそのまま使わせてもらっていて、たとえば折れ線グラフにするならこんな形です。
import plotly.express as px
# df_filledは上のコードで作った整形済みDataFrame
# yに指定する列名は、お手元のCSVに入っているPIDの表記(速度・燃費など)に置き換えてください
fig = px.line(df_filled.reset_index(), x='日付', y=['速度のPID列名', '燃費のPID列名'])
fig.show()
これでCarScannerアプリの小さい画面よりずっと見やすく、複数のPIDを重ねて比較できるようになります。PID名はCSVのヘッダーそのまま入っているので、お手元のファイルを一度print(df_filled.columns)などで確認してから列名を当てはめるのが確実です。
なお、CarScannerはBluetooth接続を手動でDisconnectしないままログを取り続けると、ログファイルが複数に分かれることがあります。今回のコードは1ファイル分を前提にしているので、複数ファイルをまたいで集計したい場合はひと手間必要になります。この挙動の詳しい仕様は長くなるので、別記事で改めて扱う予定です。
実際にこの手法で書いた記事
この整形〜グラフ化の手順は、机上の空論ではなく実際に2本の記事のベースになっています。どちらもこのやり方でログを整形してから分析しました。


こんな人には向かないかもしれません
- CarScannerアプリ内のグラフで十分な人
ざっくり傾向を見るだけならアプリ内蔵のグラフでも足ります。PCに持ち出して分析したい人向けの手順です。 - プログラミングに一切触れたくない人
コードのコピペと多少の書き換えが発生します。エラーが出た時に自力で調べる根気が要ります。 - 今すぐ結果だけ知りたい人
環境構築からグラフ表示まで、最初は数時間〜数週間かかる想定です(私は3週間かかりました)。即効性はありません。
よくある質問
Q. CarScannerの無料版でもCSVは出力できますか?
A. うちはPro(有料版)で確認しており、CSV出力機能はPro版のものです。無料版でどこまでできるかは未検証です。
Q. Pythonの経験がなくても大丈夫ですか?
A. 私自身も独学の初心者です。コードは手順通りコピペすれば動きますが、うまくいかない時に自分で調べる必要は出てきます。あくまで自己責任でお願いします。
Q. Windows/Mac両方で使えますか?
A. 手順自体はどちらでも動くはずですが、私が実際に動作確認しているのはMacBookAirのみです。Windowsでの動作は未検証なのでご了承ください。
Q. ログファイルが途中で分かれてしまうのですが、結合できますか?
A. CarScannerはBluetooth接続を手動でDisconnectしないと、ログが複数ファイルに分かれることがあります。結合の詳しい手順は別記事で改めて扱う予定です。
Q. グラフ化はPythonじゃないとダメですか?
A. いいえ、CarScannerアプリ内にもグラフ機能はあります。ただし画面が小さく複数PIDの比較がしづらいため、私はPCに持ち出す方法を選びました。
まとめ
今回の記事は独学で組んだコードなので、洗練されているとは言えないかもしれませんが実用性に問題はありません。あくまで使用は自己責任でお願いします。
CarScannerのログをCSVで残す→Pandasで整形する→plotly_expressでグラフ化する、という3ステップさえ押さえておけば、あとはお手元のPIDに合わせて列名を差し替えるだけです。うちはこのやり方で219本分のログを溜め、実測燃費の記事とEVならない病の記事の両方に活かしています。
→ うちが使っているOBDアダプタはこちら(Amazonで見る)
というわけで、CarScannerのCSVをグラフ化する手順、2026年版としてはこんな感じでした!データ分析のとっかかりとして、良いカーライフを皆さまと共有できたら幸いです。では今回はこの程度で〜!

コメント