質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.00%

  • Python 3.x

    4113questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    356questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

NaTデータを無視して積み上げ棒グラフを作るには:Pandas

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 588

pepasuke623

score 33

前提・実現したいこと

毎度お世話になります。

時間データを積み上げ棒グラフで表現したいと思っています。
具体的には次の様なことをしようとしています。

  • チェックポイントが3つあり、1番をスタートとして、もう一度1番に戻ってきたときに「周回した」としている(図を参照のこと)
  • 各行には周回,列にはルート(1地点から2地点を移動した場合は”1-2”)、行列の要素には経過時間(例えば1番めから2番めまでにかかった時間)を記載している
  • その周回では通らないルートもある。その場合はNaTが代入されている

イメージ説明
用いるデータは次のとおりです。
(途中のプログラムがあまりにも長いので、問題の部分だけを抜き出しました)

// errortime.csv
1-2,1-3,2-1,2-3,3-1,time
00:00:28.266000000,,,00:00:30.064000000,00:00:11.803000000,2017-10-13 09:24:12.304
00:00:44.362000000,,00:00:50.293000000,,,2017-10-13 09:25:22.437
00:10:50.542000000,,,00:11:01.927000000,2017-10-13 09:26:57.092


見づらいので,Print()などで出力すると次のようになります。

// errortime.csv の中身
             1-2             1-3                     2-1                     2-3  \
0 2017-10-13 00:00:28.266 NaT                     NaT 2017-10-13 00:00:30.064   
1 2017-10-13 00:00:44.362 NaT 2017-10-13 00:00:50.293                     NaT   
2 2017-10-13 00:10:50.542 NaT                     NaT 2017-10-13 00:11:01.927   

                      3-1                    time  
0 2017-10-13 00:00:11.803 2017-10-13 09:24:12.304  
1                     NaT 2017-10-13 09:25:22.437  
2 2017-10-13 09:26:57.092                     NaT  

このデータを用いて、積み上げ棒グラフを作成したいと思っています。
各周回に合計でXX秒かかって,その内訳として1-2がYY秒,2-3がZZ秒かかってたよ,というような出力がしたいです。

試したこと・発生している問題・エラーメッセージ

もとのソースコードが長すぎるので、エッセンスを抽出し、同じエラーを再現したコードが次のとおりです。

import pandas as pd

import matplotlib.pyplot as plt

# 読み込み
df = pd.read_csv('time.csv')

# 無理やり時間データに変換
for c in df.columns:
    df[c] = pd.to_datetime(df[c])

# 積み上げグラフ
df.plot.bar(y=df.columns, stacked=True)
plt.show


こうすると次のエラーがでてきます。

TypeError: Empty 'DataFrame': no numeric data to plot


NaTデータを無視して積み上げ棒グラフを作るにはどのようにしたら良いのでしょうか?
お手数ですがご教示願います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

とりあえず書いてみました。こんな感じでどうでしょうか。

質問で挙げておられますデータの3行目にて、データが1つ不足しているようです。
とりあえず、先頭に , を追加することで対応しました。

やっていることは、コード中のコメントで解ると思いますが、
全てのデータを一度 ミリ秒に変換した後にグラフを書いております。

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


# time列を時系列インデックスとして読み込む
df = pd.read_csv('errortime.csv', parse_dates=['time'], index_col='time')

# INDEX(time列)の表示フォーマットを変更(適当)
df.index = df.index.strftime('%H:%M:%S')

# 値が入っていないセルを'00:00:00'で埋める
df = df.fillna('00:00:00')

# 全てのセルを一度Timedeltaに変換した後、int値(ms) に変換する
for col in df:
    df[col] = pd.to_timedelta(df[col]).astype('int64') // 1000000

print(df)

# 行と列を入れ替えた後に棒グラフを描画
ax = df.transpose().plot(kind='bar', stacked=True)

# Y軸のラベルを "%H:%M:%S" 形式にする
formatter  = mpl.ticker.FuncFormatter(lambda x,p: str(pd.to_datetime(x,unit='ms').strftime('%H:%M:%S')))
ax.yaxis.set_major_formatter(formatter)

# Y軸の補助線間隔を 5分毎(300000ms)毎にする
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(300000))

# Y方向のみgrid
ax.yaxis.grid(True)

plt.show()

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/14 08:22

    ありがとうございます!ダミーデータで動作が確認できました。
    本当のデータと本当のソースコードの方でもやってみます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4113questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    356questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。