1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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) にて教えてください!
次回は今回マージしたデータを二軸グラフで描画します
やっと本題に入れます

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?