はじめに
前回([matplotlib 2軸グラフ ①データ生成編](matplotlib 2軸グラフ ①データ生成編))に引き続きやっていきたいと思います
今回は前回作った二つのCSVファイルの合成します
構成
全部で3部構成です
今回は「②データ合成編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep2_merge
データ合成
二つのCSVファイルを合成します
どのようなデータだったか見てみましょう
まずは心拍データ
import pandas as pd
# 心拍と体表温度のCSVファイルを読み込む
df_hb = pd.read_csv('..//heartbeat.csv')
df_tm = pd.read_csv('..//temp_bs.csv')
# head()の引数の整数は行数(デフォルトは5)
print(df_hb.head())
Time BPM
0 2018-09-01 00:00:00 99.90005
1 2018-09-01 00:00:01 99.80020
2 2018-09-01 00:00:02 99.90005
3 2018-09-01 00:00:03 100.00000
4 2018-09-01 00:00:04 100.10005
次は体表温度データ
print(df_tm.head())
Time Temperature
0 0 20.02001
1 1000000 20.00000
2 2000000 20.02001
3 3000000 20.04004
4 4000000 20.06009
プロットする際にTimeを共通のx軸にしたいのですが、このままではフォーマットが異なり、うまくマージできません
そこで体表温度データのTimeを心拍データのTimeフォーマットに合わせることにします
前回より体表温度のTimeのフォーマットは
Time(センサ取得日の0時0分を0とした経過時間) [μs]
となっています
Timeに格納されている数値を106で割って秒に直して、'YYYY/MM/DD hh :mm : ss'の形にします
以下が変更を適用するコードです
import pandas as pd
def change_format(value):
# 元データはμsなので10**6で割ってsにします
value /= 10 ** 6
# zfill(桁数)で桁数分ゼロ埋めをします
hour = str(int(value // 3600)).zfill(2)
value %= 3600
minu = str(int(value // 60)).zfill(2)
seco = str(int(value % 60)).zfill(2)
return '{}:{}:{}'.format(hour, minu, seco)
def main():
# 体表温度のCSVファイルを読み込む
df_tm = pd.read_csv('..//csv_file//temp_bs.csv')
# 時間のフォーマットを直します
# 時間列に含まれているものに無名関数を適用させます(無名関数の中にchange_format関数を内包)
df_tm['Time'] = df_tm['Time'].map(lambda t : '2018-09-01 ' + change_format(int(t)))
# CSVファイルに書き込み
df_tm.to_csv('..//csv_file//temp_bs_edited.csv', index=False)
if __name__ == '__main__':
main()
変更が適応されているか確認
-Before-
Time Temperature
0 0 20.02001
1 1000000 20.00000
2 2000000 20.02001
3 3000000 20.04004
4 4000000 20.06009
-After-
Time Temperature
0 2018-09-01 00:00:00 20.02001
1 2018-09-01 00:00:01 20.00000
2 2018-09-01 00:00:02 20.02001
3 2018-09-01 00:00:03 20.04004
4 2018-09-01 00:00:04 20.06009
しっかり変更が適用されていますね
さっそく二つのCSVデータをマージします
import pandas as pd
def main():
# 心拍と体表温度のCSVファイルを読み込む
df_hb = pd.read_csv('..//csv_file//heartbeat.csv')
df_tm = pd.read_csv('..//csv_file//temp_bs_edited.csv')
# 二つのデータをマージ
df_me = pd.merge(df_hb, df_tm)
# CSVファイルに書き込み
df_me.to_csv('..//csv_file//merged.csv', index=False)
if __name__ == '__main__':
main()
マージできてるか確認
まず先頭5行
print(df_me.head(5))
Time BPM Temperature
0 2018-09-01 00:00:00 99.90005 20.02001
1 2018-09-01 00:00:01 99.80020 20.00000
2 2018-09-01 00:00:02 99.90005 20.02001
3 2018-09-01 00:00:03 100.00000 20.04004
4 2018-09-01 00:00:04 100.10005 20.06009
末尾5行
print(df_me.tail(5))
Time BPM Temperature
29995 2018-09-01 08:19:55 110.517092 15.421032
29996 2018-09-01 08:19:56 110.627664 15.405618
29997 2018-09-01 08:19:57 110.517092 15.421032
29998 2018-09-01 08:19:58 110.627664 15.436460
29999 2018-09-01 08:19:59 110.738347 15.421032
しっかりマージできていることが確認できました
マージするときは元データどうしのkey(今回はTime)のフォーマットが同じかどうかが大変重要です
マージする前に元データを整形しておくのがオススメです
おわりに
いかがでしたでしょうか
何かありましたらコメントかTwitter(https://twitter.com/ozikot) にて教えてください!
次回は今回マージしたデータを二軸グラフで描画します
やっと本題に入れます