Python
pandas

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

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


  • 前半後半が別々のファイル形跡(.csvと.xlsx)で保存されていた → 同じように扱いたい

  • 時間が文字列として出力されていた → 数字として扱いたい

  • 時間が 時間:分:秒:センチ秒 という形式になっていた → 秒に変換したい

  • 前半と後半が別々のファイル → 統合して一つの.xslxファイルに入れたい

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

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

import pandas as pd

import datetime as dt
from IPython.display import display


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

df1 = pd.read_csv('splyza_data/firsthalf.csv')

df2 = pd.read_excel('splyza_data/secondhalf.xlsx')

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




時間
default
セットプレー
選手名
攻撃
守備
反則




0
0:00:48:96
NaN
キックオフ
NaN
NaN
NaN
NaN


1
0:00:54:88
NaN
NaN
スコット
NaN
クリア
NaN


2
0:01:01:68
NaN
NaN
スコット
NaN
ブロック
NaN


3
0:01:13:80
NaN
GK
スコット
NaN
NaN
NaN


4
0:01:18:08
NaN
NaN
スコット
パス
NaN
NaN




時間
default
セットプレー
選手名
攻撃
守備
反則




0
0:00:21:48
NaN
キックオフ
NaN
NaN
NaN
NaN


1
0:00:25:20
NaN
NaN
スコット
パス
NaN
NaN


2
0:00:41:40
NaN
スローイン
NaN
NaN
NaN
NaN


3
0:00:44:52
NaN
NaN
スコット
パス
NaN
NaN


4
0:00:47:52
NaN
NaN
スコット
ボールロスト
NaN
NaN


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

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を使って、文字列形式の時間を全て秒に変換する

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())




時間
default
セットプレー
選手名
攻撃
守備
反則




0
0.00
NaN
キックオフ
NaN
NaN
NaN
NaN


1
5.92
NaN
NaN
スコット
NaN
クリア
NaN


2
12.72
NaN
NaN
スコット
NaN
ブロック
NaN


3
24.84
NaN
GK
スコット
NaN
NaN
NaN


4
29.12
NaN
NaN
スコット
パス
NaN
NaN




時間
default
セットプレー
選手名
攻撃
守備
反則




421
5412.04
NaN
GK
スコット
ボールロスト
NaN
NaN


422
5441.40
NaN
NaN
スコット
パス
NaN
NaN


423
5441.40
NaN
NaN
NaN
ボールロスト
NaN
NaN


424
5446.40
NaN
NaN
スコット
NaN
カット
NaN


425
5483.56
NaN
GK
スコット
NaN
NaN
NaN


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

df = pd.concat([df1,df2])

display(df.head())
display(df.tail())




時間
default
セットプレー
選手名
攻撃
守備
反則




0
0.00
NaN
キックオフ
NaN
NaN
NaN
NaN


1
5.92
NaN
NaN
スコット
NaN
クリア
NaN


2
12.72
NaN
NaN
スコット
NaN
ブロック
NaN


3
24.84
NaN
GK
スコット
NaN
NaN
NaN


4
29.12
NaN
NaN
スコット
パス
NaN
NaN




時間
default
セットプレー
選手名
攻撃
守備
反則




421
5412.04
NaN
GK
スコット
ボールロスト
NaN
NaN


422
5441.40
NaN
NaN
スコット
パス
NaN
NaN


423
5441.40
NaN
NaN
NaN
ボールロスト
NaN
NaN


424
5446.40
NaN
NaN
スコット
NaN
カット
NaN


425
5483.56
NaN
GK
スコット
NaN
NaN
NaN


to_excelで.xlsxに保存する

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