tl;dr:時系列のプロット中にデータがない期間をスキップするにはどうすればよいですか?
長い計算を実行しており、その進行状況を監視したいと考えています。時々、この計算を中断します。ログは、次のような巨大な CSV ファイルに保存されます。
2016-01-03T01:36:30.958199,0,0,0,startup
2016-01-03T01:36:32.363749,10000,0,0,regular
...
2016-01-03T11:12:21.082301,51020000,13402105,5749367,regular
2016-01-03T11:12:29.065687,51030000,13404142,5749367,regular
2016-01-03T11:12:37.657022,51040000,13408882,5749367,regular
2016-01-03T11:12:54.236950,51050000,13412824,5749375,shutdown
2016-01-03T19:02:38.293681,51050000,13412824,5749375,startup
2016-01-03T19:02:49.296161,51060000,13419181,5749377,regular
2016-01-03T19:03:00.547644,51070000,13423127,5749433,regular
2016-01-03T19:03:05.599515,51080000,13427189,5750183,regular
...
実際には、41 列あります。各列は、進行状況の特定の指標です。2 番目の列は常に 10000 単位で増分されます。最後の列は一目瞭然です。
「シャットダウン」と「起動」の間の期間をスキップしながら、同じグラフに各列をプロットしたいと思います。理想的には、スキップごとに垂直線も引きたいと思います。
ここに私がこれまでに持っているものがあります:
import matplotlib.pyplot as plt
import pandas as pd
# < ... reading my CSV in a Pandas dataframe `df` ... >
fig, ax = plt.subplots()
for col in ['total'] + ['%02d' % i for i in range(40)]:
ax.plot_date(df.index.values, df[col].values, '-')
fig.autofmt_xdate()
plt.show()
その長いフラット期間を取り除き、代わりに垂直線だけを描きたい.
については知ってdf.plot()
いますが、私の経験では壊れています (とりわけ、Pandasdatetime
はオブジェクトを独自の形式で変換し、 と を使用しdate2num
ませんnum2date
)。
考えられる解決策は、カスタム scalerを作成することですが、それはかなり複雑に思えます。
私が理解している限り、カスタムLocator
を作成しても目盛りの位置 (小さな垂直線と関連するラベル) のみが変更され、プロット自体の位置は変更されません。あれは正しいですか?
UPD:簡単な解決策は、タイムスタンプを変更することです (たとえば、「開始からの経過時間」に再計算します) が、それらを保持することをお勧めします。
UPD: https://stackoverflow.com/a/5657491/1214547の回答は、いくつかの変更を加えて機能します。私はすぐに私の解決策を書きます。