前回のおさらい:ヘッダーとデータを場合分け
前回は温度・湿度ロガーのデータを分析するため、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ファイルがあった場合、一つのリストに全てのデータを格納することができます。
どのようにデータを格納するのかというのは、データの扱い方によって変わるので、注意してください。
とりあえずこれでデータの格納までできました。
次回はとうとうグラフ表示を行なっていきます。

ということで今回はこんな感じで。
コメント