matplotlib 2軸グラフ　②データ合成編

# はじめに
前回（[matplotlib 2軸グラフ　①データ生成編](matplotlib 2軸グラフ　①データ生成編)）に引き続きやっていきたいと思います
今回は前回作った二つのCSVファイルの合成します

# 構成
全部で3部構成です

* [matplotlib 2軸グラフ　①データ生成編](https://qiita.com/ozikot/items/604c96c6714f50b55f26)
* [matplotlib 2軸グラフ　②データ合成編](https://qiita.com/ozikot/items/f7e5c346e631de067efb)←今ここ
* [matplotlib 2軸グラフ　③プロット編](https://qiita.com/ozikot/items/a742487147fbdd666d88)

今回は「②データ合成編」です
使用するコードは以下に載せてあります
https://github.com/ozikot/BiaxialPlot/tree/master/ep2_merge


# データ合成
二つのCSVファイルを合成します
どのようなデータだったか見てみましょう
  
まずは心拍データ

```python
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
```

次は体表温度データ

```python
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フォーマットに合わせることにします

[前回](https://qiita.com/ozikot/items/604c96c6714f50b55f26)より体表温度のTimeのフォーマットは
> Time(センサ取得日の0時0分を0とした経過時間) [μs]

となっています

Timeに格納されている数値を10<sup>6</sup>で割って秒に直して、'YYYY/MM/DD hh :mm : ss'の形にします

以下が変更を適用するコードです

```python
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データをマージします

```python
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行

```python
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行

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

* 次回  
[matplotlib 2軸グラフ　③プロット編](https://qiita.com/ozikot/items/a742487147fbdd666d88)