メモランダム!!

自分用の端書のため,他の人が読めるようには書いていません.悪しからずm(_ _)m

データフレームの各行の差を計算してグラフ化する:Pandas

やりたいことしては,タイトル通り『データフレームの各行の差を計算してグラフ化する』ことです.Pandasのデータフレームを用いて各列の時間差を計算してグラフに出力するということをやります.

今回はTimedelta型を使っているのですが,データフレームの差を計算して描画しようとすると「'Timedelta' object has no attribute 'plot'」というエラーメッセージ出てきます.無理やりint型になおして出力するとナノ秒になってしまうので,これを上手く工夫して出力しなくてはなりません.

ここからが本題

さて,こんなデータを使います.各駅の名前とそこを通過する時間が記載されているデータがあるとします.

//time.csv
hakata,10:00:05.156
yoshiduka,10:29:54.731
kadomatu,11:03:44.195
katuragawa,11:38:32.395
tendou,12:09:21.151
iiduka,12:46:10.364
kokura,13:21:59.996

このとき前の駅から今の駅まで到着するのにかかった時間を計算してグラフに出力します.

Python3のコード

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

# CSVデータの読み込み
df = pd.read_csv('data/time.csv', header=None, names=['sta', 'time'])

# 時間型に変換
df['time'] = df['time'].apply(lambda xx: pd.to_datetime(xx))

# 時間差の計算.各行の差を計算する
df_e =df['time'].diff(1).fillna(0)

# 描画
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(df['sta'], df_e)

# ナノ秒から変換
def toChange(y, i):
    h = int(y / 1000000000 / 3600)
    m = int(y / 1000000000 / 60)
    s = int(y / 1000000000 % 60)
    return '%(h)02d:%(m)02d:%(s)02d' % {'h': h, 'm': m, 's': s}

from matplotlib.ticker import FuncFormatter as ff

ax.yaxis.set_major_formatter(ff(toChange))
plt.grid()

plt.show()

結果

するとこんなふうに出力されます
f:id:shu10038:20180610204723j:plain