Pythonでデータロガーのログから瞬断を抽出してみる
時刻と電圧を記録したcsvファイルを出力するデータロガーがあるとします。
そのログのデータが膨大で、人間が処理すると大変なことになるので、Pythonを使って楽をしたいと思います。
残念ながら、そのデータロガーは手元にないので、こんなログを吐くだろうなという予測をしてプログラムを作ってみます。骨格を作っておいて、あとは現場で調整するわけです。
目次
テスト用のデータを作る
件のデータロガーが手元にないので、テスト用のデータを作ります。 ログの書式がcsvだということだけはわかっていますので、csvモジュールを使います。
import csv
import random
random.seed(1)
data_array = []
for j in range(0,10,2):
for i in range(j*1000, j*1000+1000):
timing = float(i) / 1000.0
data_array.append([timing, 0.0])
for i in range(j*1000+1000, j*1000+2000):
timing = float(i) / 1000.0
if random.random() > 0.995:
data_array.append([timing, 0.0])
else:
data_array.append([timing, 5.0])
with open('data.csv', mode = 'wt', newline='') as fout:
csvout = csv.writer(fout)
csvout.writerows(data_array)
print('finish')
出力されるデータはこんな感じです。
0.0,0.0
0.001,0.0
0.002,0.0
0.003,0.0
0.004,0.0
0.005,0.0
# 後略
出力されたデータをグラフにすると、こんな感じになります。
csvモジュールって、便利ですねえ。
いつ瞬断したか調べてみる
まず、瞬断とはどういう状態かを定義します。今回は下記とします。
数値が4未満のときをOFFとする
期間が0.5未満のときを瞬断とする
これに合致するデータを、またcsvで出力させてみます。
import csv
DURATION = 0.5 # これより短い場合を出力する
THRESHOLD = 4.0 # これより小さい場合はOFFとする
START_TIME = 0.0
with open('data.csv', mode='r', newline='') as f_in:
reader = csv.reader(f_in)
data_array = [row for row in reader]
short_break = []
sw = False
start = START_TIME
for i in data_array:
if float(i[1]) < THRESHOLD:
if sw == True:
start = float(i[0])
sw = False
else:
if sw == False:
time_span = float(i[0]) - start
if time_span < DURATION:
short_break.append([i[0], time_span])
sw = True
with open('short_break.csv', mode = 'wt', newline='') as f_out:
csvout = csv.writer(f_out)
csvout.writerows(short_break)
print('finish')
出力されるデータは下記のようになります。
1.853,0.0009999999999998899
1.921,0.001000000000000112
1.946,0.0009999999999998899
3.179,0.0009999999999998899
3.448,0.0009999999999998899
3.476,0.0009999999999998899
3.874,0.0009999999999998899
5.258,0.001000000000000334
5.291,0.002000000000000668
5.377,0.0009999999999994458
5.739,0.0009999999999994458
5.991,0.0009999999999994458
7.136,0.001000000000000334
7.346,0.001000000000000334
7.579,0.0009999999999994458
7.926,0.001000000000000334
9.209,0.0009999999999994458
9.558,0.0009999999999994458
9.649,0.0009999999999994458
9.875,0.0009999999999994458
時刻が5のあたりの元データをグラフにしてみます。
検出できてますね。
公開日
広告
作ってみたカテゴリの投稿
- PythonでFizzBuzz問題をやってみた
- PythonでPDFファイルのサムネイル画像を作る
- Pythonでオブジェクトを選択してクロップするツールを作ってみた
- Pythonでデータロガーのログから瞬断を抽出してみる
- Pythonで写真の中の線を抽出してみた
- Pythonで動画から静止部分を抜き出してみた
- Pythonで測定データのピーク値を検出してみる
- Pythonで複数のCSVデータを1つのファイルにまとめてみた
- PythonとExcelでフォルダの使用量を調べてみた
- Sphinx(ablog)の後処理をする
- WordPressのブログを静的サイトに書き換えてみました
- シェルスクリプトでSphinxのビルドの前処理をする
- 数式を中置記法から後置記法(逆ポーランド記法)に変換してみた