LoginSignup
0
1

More than 5 years have passed since last update.

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

Posted at

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

  • 前半後半が別々のファイル形跡(.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')
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1