サッカーのデータを取得するツールを使って、出力したデータをいざ分析しようと思ったときに、
- 前半後半が別々のファイル形跡(.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')