2017-03-22 26 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 errorbars。我使用以下方法來找到我想要

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 

的錯誤跟蹤似乎與日期的轉換,雖然被關注,所以我們可以處理基本相同的問題 - 你日期存儲爲日期對象?我能夠明確後轉換datesDatetime對象成功運行示例代碼,使用to_datetime()

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()(可選設置date爲指標,你也可以只設置x='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。 第二個解決方案有效,所以我會繼續並將其解決! 甚至不記得我最終做了什麼,可能只是手動做它沒有熊貓... – FHTMitchell

相關問題