2017-03-22 4 views
1

私はsolfluxと呼ばれる日付と最大値と最小値とのパンダのデータフレームを持っている:pandas/matplotlibから "OverflowError:Python intがC longに変換するには大きすぎます"というエラーが表示されるのはなぜですか?

date  max min 
0 2015-01-01 148 10.5 
1 2015-02-01 142 9.5 
2 2015-03-01 140 9.0 
3 2015-04-01 135 7.5 
4 2015-05-01 132 7.5 
... 

私はmatplotlibの中にエラーバーとして、これらの値をプロットしたいです。私は、このエラーを取得する私は

dates = solflux['date'] 
deltas = (solflux['max'] - solflux['min'])/2 
means = solflux['min'] + deltas 

をしたい値を検索し、

import matplotlib.pyplot as plt 
f = plt.figure() 
ax = f.add_subplot(111) 
ax.errorbar(dates, means, marker='+', yerr=deltas) 

にプロットするために、次を使用します。

C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individu 
al plots. 
    warnings.warn("No labelled objects found. " 
Traceback (most recent call last): 
    File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 197, in __draw_idle_agg 
    FigureCanvasAgg.draw(self) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py", line 464, in draw 
    self.figure.draw(self.renderer) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1143, in draw 
    renderer, self, dsu, self.suppressComposite) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\image.py", line 139, in _draw_list_compositing_images 
    a.draw(renderer) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 2409, in draw 
    mimage._draw_list_compositing_images(renderer, self, dsu) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\image.py", line 139, in _draw_list_compositing_images 
    a.draw(renderer) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1136, in draw 
    ticks_to_draw = self._update_ticks(renderer) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 969, in _update_ticks 
    tick_tups = [t for t in self.iter_ticks()] 
    File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 969, in <listcomp> 
    tick_tups = [t for t in self.iter_ticks()] 
    File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 912, in iter_ticks 
    majorLocs = self.major.locator() 
    File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 983, in __call__ 
    self.refresh() 
    File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 1003, in refresh 
    dmin, dmax = self.viewlim_to_dt() 
    File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 760, in viewlim_to_dt 
    return num2date(vmin, self.tz), num2date(vmax, self.tz) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 401, in num2date 
    return _from_ordinalf(x, tz) 
    File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 254, in _from_ordinalf 
    dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC) 
OverflowError: Python int too large to convert to C long 

奇妙なことは、私は無視するということですyerr部分だけ実行する

ax.plot(dates, means, marker='+') 

はすべて正常に動作します。私はこれがmatplotlibのバグだと思っていますが、誰かに何か提案があるのだろうかと疑問に思っていましたか?

私は、Python 3.6.0、Matplotlib 2.0.0、Pandas 0.19.2を実行しています。私が知っている限り最新のものです。

答えて

2

あなたのサンプルコードを実行しようとしたときにエラーが発生しましたが、あなたが投稿したものと同じではありませんでした。あなたも投稿

ValueError: invalid literal for float(): 2015-01-01 

エラートレースはしかし日付変換、と心配しているように見えるので、私たちは基本的に同じ問題に対処することができる - あなたの日付は、日付オブジェクトとして格納されています。私が見誤差はありますか?私はto_datetime()使用して、明示的にDatetimeオブジェクトにdatesを変換した後、正常にサンプルコードを実行することができるよ:

date  max min 
0 2015-01-01 148 10.5 
1 2015-02-01 142 9.5 
2 2015-03-01 140 9.0 
3 2015-04-01 135 7.5 
4 2015-05-01 132 7.5 

solflux = pd.read_clipboard() 
dates = pd.to_datetime(solflux['date']) 
deltas = (solflux['max'] - solflux['min'])/2 
means = solflux['min'] + deltas 

f = plt.figure() 
ax = f.add_subplot(111) 
ax.errorbar(dates, means, marker='+', yerr=deltas) 

time series plot

ただし、あなたはネイティブパンダの機能を使用して同じ結果を得ることができ、

solflux.date = pd.to_datetime(solflux.date) 
solflux['deltas'] = (solflux['max'] - solflux['min'])/2 
solflux['means'] = solflux['min'] + solflux.deltas 

データフレーム:

と目盛りラベルは、このようすっきりビットを終わります
 date max min deltas means 
0 2015-01-01 148 10.5 68.75 79.25 
1 2015-02-01 142 9.5 66.25 75.75 
2 2015-03-01 140 9.0 65.50 74.50 
3 2015-04-01 135 7.5 63.75 71.25 
4 2015-05-01 132 7.5 62.25 69.75 

今(あなたもちょうどplot()x='date'を設定することができ、必要に応じてインデックスとしてdate設定)plot()を使用します。

solflux.set_index('date').plot(y='means', yerr='deltas', legend=False) 

time series plot with pandas

+0

のみ7ヶ月下旬これに応じます。面白いことに、まったく新しいシステム(まだWindows 64ビット - Python 3.6 64ビット)でも、最初のmatplotlibソリューションでも、OverflowErrorはまだ得られます。 2番目のソリューションが機能するので、これを解決してマークします。 最後にやったことを覚えていなくても、おそらく手動でパンダを使わずにやっただけです。 – FHTMitchell

関連する問題