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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

pandas

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

Q&A

解決済

1回答

3485閲覧

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

pepasuke623

総合スコア55

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2017/10/13 06:14

編集2017/10/13 06:23

###前提・実現したいこと
毎度お世話になります。

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

  • チェックポイントが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秒かかってたよ,というような出力がしたいです。

###試したこと・発生している問題・エラーメッセージ
もとのソースコードが長すぎるので、エッセンスを抽出し、同じエラーを再現したコードが次のとおりです。

Python

1import pandas as pd 2 3import matplotlib.pyplot as plt 4 5# 読み込み 6df = pd.read_csv('time.csv') 7 8# 無理やり時間データに変換 9for c in df.columns: 10 df[c] = pd.to_datetime(df[c]) 11 12# 積み上げグラフ 13df.plot.bar(y=df.columns, stacked=True) 14plt.show

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

質問で挙げておられますデータの3行目にて、データが1つ不足しているようです。

とりあえず、先頭に , を追加することで対応しました。

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

Python

1import pandas as pd 2import matplotlib as mpl 3import matplotlib.pyplot as plt 4 5 6# time列を時系列インデックスとして読み込む 7df = pd.read_csv('errortime.csv', parse_dates=['time'], index_col='time') 8 9# INDEX(time列)の表示フォーマットを変更(適当) 10df.index = df.index.strftime('%H:%M:%S') 11 12# 値が入っていないセルを'00:00:00'で埋める 13df = df.fillna('00:00:00') 14 15# 全てのセルを一度Timedeltaに変換した後、int値(ms) に変換する 16for col in df: 17 df[col] = pd.to_timedelta(df[col]).astype('int64') // 1000000 18 19print(df) 20 21# 行と列を入れ替えた後に棒グラフを描画 22ax = df.transpose().plot(kind='bar', stacked=True) 23 24# Y軸のラベルを "%H:%M:%S" 形式にする 25formatter = mpl.ticker.FuncFormatter(lambda x,p: str(pd.to_datetime(x,unit='ms').strftime('%H:%M:%S'))) 26ax.yaxis.set_major_formatter(formatter) 27 28# Y軸の補助線間隔を 5分毎(300000ms)毎にする 29ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(300000)) 30 31# Y方向のみgrid 32ax.yaxis.grid(True) 33 34plt.show()

イメージ説明

投稿2017/10/13 11:02

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepasuke623

2017/10/13 23:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問