Pythonでデータロガーのログから瞬断を抽出してみる

時刻と電圧を記録したcsvファイルを出力するデータロガーがあるとします。

そのログのデータが膨大で、人間が処理すると大変なことになるので、Pythonを使って楽をしたいと思います。

残念ながら、そのデータロガーは手元にないので、こんなログを吐くだろうなという予測をしてプログラムを作ってみます。骨格を作っておいて、あとは現場で調整するわけです。

目次

  1. テスト用のデータを作る
  2. いつ瞬断したか調べてみる

テスト用のデータを作る

件のデータロガーが手元にないので、テスト用のデータを作ります。 ログの書式が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
# 後略

出力されたデータをグラフにすると、こんな感じになります。

../../_images/python_log_analysis_01.png

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のあたりの元データをグラフにしてみます。

../../_images/python_log_analysis_02.png

検出できてますね。

公開日

広告