【Python】IBS-TH1 PLUSのデータ分析:データの変換と格納

  • URLをコピーしました!
目次

前回のおさらい:ヘッダーとデータを場合分け

前回は温度・湿度ロガーのデータを分析するため、CSVファイルを読み込み、ヘッダーの部分とデータの部分を場合分けしました。

今回はデータをグラフにできるよう変換し、格納します。

まずは前回のおさらいから。

import os
import shutil
import csv

def is_float(val):
    try:
        float(val)
    except:
        return False
    else:
        return True

path = os.getcwd()

data_path = path + "//Data//"

for f in os.listdir(path):
    if f[-4:] == ".csv":
        shutil.move(f, data_path + f)
        
for f in os.listdir(data_path):
    if f[-4:] == ".csv":
        file = open(data_path + f, "r")
        reader = csv.reader(file)
        
        for row in reader:
            if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
                print(row)

        file.close()

実行結果
['2019-12-29 18:53:36', '26.59', '22.12']
['2019-12-29 19:23:36', '25.37', '23.46']
['2019-12-29 19:53:36', '24.15', '24.79']
['2019-12-29 20:23:36', '22.93', '26.13']
['2019-12-29 20:53:36', '21.71', '27.46']
(以下省略)

実行結果の最初の値は日時、2つ目、3つ目の値は小数です。

これらを変換していきましょう。

文字(str型)から小数(float型)への変換

まずは簡単な方から行います。

文字であるstr型から小数であるfloat型に変更するのは float(値)で変換できます。

今回はちゃんとstr型からfloat型へと変換できているかtyep(値)を使って確認してみましょう。

import os
import shutil
import csv

def is_float(val):
    try:
        float(val)
    except:
        return False
    else:
        return True

path = os.getcwd()

data_path = path + "//Data//"

for f in os.listdir(path):
    if f[-4:] == ".csv":
        shutil.move(f, data_path + f)
        
for f in os.listdir(data_path):
    if f[-4:] == ".csv":
        file = open(data_path + f, "r")
        reader = csv.reader(file)
        
        for row in reader:
            if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
                val1 = float(row[1])
                val2 = float(row[2])
                
                print(type(row[1]), type(val1),type(row[2]), type(val2))

        file.close()

実行結果
<class 'str'> <class 'float'> <class 'str'> <class 'float'>
<class 'str'> <class 'float'> <class 'str'> <class 'float'>
<class 'str'> <class 'float'> <class 'str'> <class 'float'>
<class 'str'> <class 'float'> <class 'str'> <class 'float'>
<class 'str'> <class 'float'> <class 'str'> <class 'float'>
(以下省略)

row[1]とrow[2]をfloat(値)でfloat型に変換してものを、それぞれval1、val2に格納しています。

type(row[1])、type(row[2])の場合は<class ‘str’>と表示されています。

またtype(val1)、type(val2)の場合は<class ‘float’>と表示されており、float型に変換できていることが分かります。

文字(str型)から日時への変換

日時に変換するには、まずはdatetimeモジュールというものを使います。

前にも解説していますので、良かったらこちらの記事もご覧ください。

とりあえずdatetimeモジュールをインポートする必要があります。

import datetime

そしてstrptime(文字列, フォーマット)により日付型であるdatetime型に変換できます。

まずはフォーマットから解説します。

今回は「2019-12-29 18:53:36」という形に日時が書かれています。

この場合、フォーマットとしては、「”%Y-%m-%d %H:%M:%S”」となります。

つまり%YがYear(年)、%mがmonth(月)、%dがday(日)、%HがHour(時)、%MがMin(分)、%SがSec(秒)というわけです。

ということで組み込んでいきます。

import os
import shutil
import csv
import datetime

def is_float(val):
    try:
        float(val)
    except:
        return False
    else:
        return True

path = os.getcwd()

data_path = path + "//Data//"

for f in os.listdir(path):
    if f[-4:] == ".csv":
        shutil.move(f, data_path + f)
        
for f in os.listdir(data_path):
    if f[-4:] == ".csv":
        file = open(data_path + f, "r")
        reader = csv.reader(file)
        
        for row in reader:
            if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
                val0 = datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S")
                val1 = float(row[1])
                val2 = float(row[2])
                
                print(type(val0), val0)

        file.close()

実行結果
<class 'datetime.datetime'> 2019-12-29 18:53:36
<class 'datetime.datetime'> 2019-12-29 19:23:36
<class 'datetime.datetime'> 2019-12-29 19:53:36
<class 'datetime.datetime'> 2019-12-29 20:23:36
<class 'datetime.datetime'> 2019-12-29 20:53:36

変数val0にdatetimeで変換した日時データを格納しました。

type(val0)で型を確認すると、<class ‘datetime.datetime’>ということでdatetime型に変換できていることが分かります。

リストへの格納

これでデータの値をグラフに表示できる形式にすることができました。

しかし現在の状態ではデータは全く保存されていません。

for row in reader:
    if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
        val0 = datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S")
        val1 = float(row[1])
        val2 = float(row[2])
                
        print(type(val0), val0)

この部分をみると分かりますが、データを一行ずつ取得し、条件にあったものを加工し、表示しているだけです。

つまり次の行へいったら、row[0]、row[1]、row[2]の値は変わってしまいますし、val0、val1、val2は上書きされてしまいます。

ということでこれを一度、リストへ格納して、保存していきます。

ちなみにリストの解説はこちらにありますので、良かったらご覧ください。

まずは空のリストを作成します。

今回は時間、温度、湿度ということで、time、temperature、humidityというリストを作成しました。

time = []; temperature = []; humidity = []

このリストに追加するには、リスト名.append(追加するもの)で追加できます。

ということでリストに追加する部分のプログラムはこうなります。

time.append(datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
temperature.append(float(row[1]))
humidity.append(float(row[2]))

ではこれを組み込んでいきますが、組み込む場所に注意してください。

import os
import shutil
import csv
import datetime

def is_float(val):
    try:
        float(val)
    except:
        return False
    else:
        return True

path = os.getcwd()

data_path = path + "//Data//"

for f in os.listdir(path):
    if f[-4:] == ".csv":
        shutil.move(f, data_path + f)
        
time = []; temperature = []; humidity = []
    
for f in os.listdir(data_path):
    if f[-4:] == ".csv":
        file = open(data_path + f, "r")
        reader = csv.reader(file)
        
        for row in reader:
            if row != [] and is_float(row[1]) == True and is_float(row[2]) == True:
                time.append(datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
                temperature.append(float(row[1]))
                humidity.append(float(row[2]))

        file.close()
                
print(time)
print(temperature)
print(humidity)

実行結果
[datetime.datetime(2019, 12, 29, 18, 53, 36), datetime.datetime(2019, 12, 29, 19, 23, 36), datetime.datetime(2019, 12, 29, 19, 53, 36), datetime.datetime(2019, 12, 29, 20, 23, 36), datetime.datetime(2019, 12, 29, 20, 53, 36), datetime.datetime(2019, 12, 29, 21, 23, 36), (省略)]
[26.59, 25.37, 24.15, 22.93, 21.71, 20.48, 19.26, 18.04, 16.82, 15.6, 16.11, 16.53, 16.96, 17.38, 17.8, 18.23, 18.65, 19.07, 19.5, 19.92, 19.72, 19.79, 19.86, 19.92, 19.99, 20.06, 20.13, 20.19, 20.26, 20.33, 22.84, 21.08]
[22.12, 23.46, 24.79, 26.13, 27.46, 28.8, 30.13, 31.47, 32.8, 34.14, 41.9, 42.84, 43.79, 44.73, 45.67, 46.62, 47.56, 48.5, 49.45, 50.39, 50.57, 51.01, 51.45, 51.88, 52.32, 52.76, 53.2, 53.63, 54.07, 54.51, 49.99, 30.65]

空のリスト作成は、それぞれのCSVファイルを開く前に追加します。

こうすることで複数のCSVファイルがあった場合、一つのリストに全てのデータを格納することができます。

どのようにデータを格納するのかというのは、データの扱い方によって変わるので、注意してください。

とりあえずこれでデータの格納までできました。

次回はとうとうグラフ表示を行なっていきます。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次