時間が文字列になっているときに２つの時系列データをPython/Pandasで統合させる方法


サッカーのデータを取得するツールを使って、出力したデータをいざ分析しようと思ったときに、

- 前半後半が別々のファイル形跡（.csvと.xlsx）で保存されていた　→　同じように扱いたい
- 時間が文字列として出力されていた　→　数字として扱いたい
- 時間が　時間：分：秒：センチ秒　という形式になっていた　→　秒に変換したい
- 前半と後半が別々のファイル　→　統合して一つの.xslxファイルに入れたい

などの問題がありました。

Pandasとdatetimeのライブラリを使うことで大体解決できました。

```python
import pandas as pd
import datetime as dt
from IPython.display import display
```

##.csvと.xlsxをDataFrameに読み込む

```python
df1 = pd.read_csv('splyza_data/firsthalf.csv')
df2 = pd.read_excel('splyza_data/secondhalf.xlsx')

display(df1.head())
display(df2.head())
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0:00:48:96</td>
      <td>NaN</td>
      <td>キックオフ</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0:00:54:88</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>クリア</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0:01:01:68</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>ブロック</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0:01:13:80</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0:01:18:08</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0:00:21:48</td>
      <td>NaN</td>
      <td>キックオフ</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0:00:25:20</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0:00:41:40</td>
      <td>NaN</td>
      <td>スローイン</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>0:00:44:52</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>0:00:47:52</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>ボールロスト</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>


##strptimeで文字列の時間情報を読み込む

```python
t = df1['時間'][0]
print(type(t))

#ここがポイント！
_t = dt.datetime.strptime(t,'%H:%M:%S:%f')
print(type(_t))
print(_t)

z = dt.datetime.strptime('','')
print(z)

d = _t - z
d.total_seconds()
```

    <class 'str'>
    <class 'datetime.datetime'>
    1900-01-01 00:00:48.960000
    1900-01-01 00:00:00

##DataFrameにapplyを使って、文字列形式の時間を全て秒に変換する

```python
def f(t, offset=Non
    48.96

```python
#オフセットは病に時間を変換した後に、任意の秒数ずらすための引数
#サッカーだとキックオフ時間を0秒に合わせたいので作った
def f(t, offset=None):
    _t = dt.datetime.strptime(t,'%H:%M:%S:%f')
    z = dt.datetime.strptime('','')
    d = _t - z
    d = d.total_seconds()
    if offset is not None:
        d+=offset
    return d

df1['時間'] = df1['時間'].apply(lambda x: f(x,-48.96))
df2['時間'] = df2['時間'].apply(lambda x: f(x,df1['時間'].iloc[-1]-21.48))

display(df1.head())
display(df2.tail())
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.00</td>
      <td>NaN</td>
      <td>キックオフ</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>5.92</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>クリア</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>12.72</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>ブロック</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>24.84</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>29.12</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>421</th>
      <td>5412.04</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>ボールロスト</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>422</th>
      <td>5441.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>423</th>
      <td>5441.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>ボールロスト</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>424</th>
      <td>5446.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>カット</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>425</th>
      <td>5483.56</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>


##concatで一つのデータフレームにまとめる

```python
df = pd.concat([df1,df2])
display(df.head())
display(df.tail())
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.00</td>
      <td>NaN</td>
      <td>キックオフ</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>5.92</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>クリア</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>12.72</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>ブロック</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>24.84</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>29.12</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>時間</th>
      <th>default</th>
      <th>セットプレー</th>
      <th>選手名</th>
      <th>攻撃</th>
      <th>守備</th>
      <th>反則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>421</th>
      <td>5412.04</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>ボールロスト</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>422</th>
      <td>5441.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>パス</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>423</th>
      <td>5441.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>ボールロスト</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>424</th>
      <td>5446.40</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>カット</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>425</th>
      <td>5483.56</td>
      <td>NaN</td>
      <td>GK</td>
      <td>スコット</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>


##to_excelで.xlsxに保存する

```python
df.to_excel('splyza_data/20190406.xlsx',encoding='shift-jis')
```