2017-04-02 1 views
1

J'ai rencontré un problème en remplissant un vecteur de date numérique en utilisant la version actuelle de pandas. Le même code fonctionne avec une version antérieure. Ce qui suit montre mon problème:pandas Erreur DataFrame "index tuple hors plage"

L'ancienne version (0.7.3) fonctionne

C:\WINDOWS\system32>pip show pandas 
Name: pandas 
Version: 0.7.3 
Summary: Powerful data structures for data analysis and statistics 
Home-page: http://pandas.pydata.org 
Author: The PyData Development Team 
Author-email: [email protected] 
License: BSD 
Location: c:\program files\python\python27\lib\site-packages 
Requires: python-dateutil, numpy 

C:\WINDOWS\system32>python 
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> d=np.array([None, None, None, None, dt.now(), None]) 
>>> b = DataFrame(d) 
>>> b.fillna(method='backfill') 
          0 
0 2017-04-02 12:21:18.175000 
1 2017-04-02 12:21:18.175000 
2 2017-04-02 12:21:18.175000 
3 2017-04-02 12:21:18.175000 
4 2017-04-02 12:21:18.175000 
5      None 
>>> 

La vesion actuelle (0.19.2) ne fonctionne pas:

C:\WINDOWS\system32>pip show pandas 
Name: pandas 
Version: 0.19.2 
Summary: Powerful data structures for data analysis, time series,and statistics 
Home-page: http://pandas.pydata.org 
Author: The PyData Development Team 
Author-email: [email protected] 
License: BSD 
Location: c:\program files\python\python27\lib\site-packages 
Requires: pytz, python-dateutil, numpy 


C:\WINDOWS\system32>python 
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from datetime import datetime as dt 
>>> import numpy as np 
>>> from pandas import DataFrame 
>>> d=np.array([None, None, None, None, dt.now(), None]) 
>>> b = DataFrame(d) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files\Python\Python27\lib\site-packages\pandas\core\frame.py", line 297, in __init__ 
    copy=copy) 
    File "C:\Program Files\Python\Python27\lib\site-packages\pandas\core\frame.py", line 474, in _init_ndarray 
    return create_block_manager_from_blocks([values], [columns, index]) 
    File "C:\Program Files\Python\Python27\lib\site-packages\pandas\core\internals.py", line 4256, in create_block_manager_from_blocks 
    construction_error(tot_items, blocks[0].shape[1:], axes, e) 
    File "C:\Program Files\Python\Python27\lib\site-packages\pandas\core\internals.py", line 4230, in construction_error 
    if block_shape[0] == 0: 
IndexError: tuple index out of range 
>>> 

Suis-je faire quelque chose mal ou est-ce, comme je pense, un bug chez les pandas? Si c'est un bug, comment puis-je signaler cela?

EDIT: Ceci a été déposé comme un rapport de bogue avec Pandas et sera corrigé dans la prochaine relase mineur (0.19.3)

Répondre

2

DataFrame(d) échoue, et je ne sais pas pourquoi, mais Series(d) œuvres, de sorte que vous pouvez le faire:

pd.DataFrame({0:d}) 

C'est, dire explicitement Pandas que d est une série appelée 0, qui est ce qu'il faisait implicitement dans l'ancienne version 0.7.

Si vous souhaitez signaler un bug, vous pouvez simplement dire que cela fonctionne:

pd.DataFrame([None, None, datetime.datetime.now()]) 

Mais cela ne fonctionne pas:

pd.DataFrame([None, None, None, datetime.datetime.now()]) 
+0

Merci pour cette réponse. Êtes-vous en mesure de me dire où signaler cela? Pouvez-vous également expliquer ce qui se passe dans votre test. Pourquoi l'un fonctionne-t-il et l'autre non? –

+0

@RichardB: Le traqueur de problème de Pandas est ici: https://github.com/pandas-dev/pandas/issues –

0

Essayez de préciser (ou cast) le dtype explicitement:

In [18]: d=np.array([None, None, None, None, pd.datetime.now(), None]) 

In [19]: b = DataFrame(d.astype('datetime64[ms]')) 

In [20]: b 
Out[20]: 
         0 
0      NaT 
1      NaT 
2      NaT 
3      NaT 
4 2017-04-02 20:34:20.381 
5      NaT 

In [21]: b.bfill() 
Out[21]: 
         0 
0 2017-04-02 20:34:20.381 
1 2017-04-02 20:34:20.381 
2 2017-04-02 20:34:20.381 
3 2017-04-02 20:34:20.381 
4 2017-04-02 20:34:20.381 
5      NaT