2013-03-28 2 views
1

Je suis confronté au même problème que celui soulevé dans How to trouble-shoot HDFStore Exception: cannot find the correct atom type.HDFStore Exception: impossible de trouver le type d'atome correct: un cas de base

Je le réduit à un exemple donné dans la documentation des pandas Storing Mixed Types in a Table.

Le point entier dans cet exemple est à append un DataFrame avec quelques valeurs manquantes à HDFStore. Lorsque j'utilise l'exemple de code, je me retrouve avec un atom type error.

df_mixed 
Out[103]: 
      A   B   C bool   datetime64 int string 
0 -0.065617 -0.062644 -0.004758 True 2001-01-02 00:00:00 1 string 
1 1.444643 1.664311 -0.189095 True 2001-01-02 00:00:00 1 string 
2 0.569412 -0.077504 -0.125590 True 2001-01-02 00:00:00 1 string 
3  NaN  NaN 0.563939 True     NaN 1  NaN 
4  NaN  NaN -0.618218 True     NaN 1  NaN 
5  NaN  NaN 1.477307 True     NaN 1  NaN 
6 -0.287331 0.984108 -0.514628 True 2001-01-02 00:00:00 1 string 
7 -0.244192 0.239775 0.861359 True 2001-01-02 00:00:00 1 string 

store=HDFStore('df.h5') 
store.append('df_mixed', df_mixed, min_itemsize={'values':50}) 

... 
Exception: cannot find the correct atom type -> [dtype->object,items->Index([datetime64, string], dtype=object)] object of type 'Timestamp' has no len() 

Si je dtype pour les mettre en vigueur les types problématiques (en fait les object ones) comme le suggère le poste lié (la réponse de Jeff), je reçois toujours la même erreur. Qu'est-ce que j'oublie ici?

dtypes = [('datetime64', '|S20'), ('string', '|S20')] 

store=HDFStore('df.h5') 
store.append('df_mixed', df_mixed, dtype=dtypes, min_itemsize={'values':50}) 

... 
Exception: cannot find the correct atom type -> [dtype->object,items->Index([datetime64, string], dtype=object)] object of type 'Timestamp' has no len() 

Merci pour avoir un aperçu

RESOUDRE

j'utilisais pandas 0,10 et 0,11 sont passés à -dev. Comme Jeff a déduit, le problème était avec NaN vs NaT.

L'ancienne version pandas géants produit

df_mixed.ix[3:5,['A', 'B', 'string', 'datetime64']] = np.nan such that 

2 0.569412 -0.077504 -0.125590 True 2001-01-02 00:00:00 1 string 
3  NaN  NaN 0.563939 True     NaN 1  NaN 

tandis que la seconde la version

2 0.569412 -0.077504 -0.125590 True 2001-01-02 00:00:00 1 string 
3  NaN  NaN 0.563939 True     NaT 1  NaN 

Répondre

2

Le problème sont les NaN dans votre datetime64 série [ns]. Ceux-ci DOIVENT être NaT. Comment avez-vous construit ce cadre? Quelle version de pandas utilisez-vous?

Pouvez-vous utiliser 0.11-dev? (il y a plusieurs autres options ici). Essayez ceci:

df['datetime64'] = Series(df['datetime64'],dtype='M8[n2]')

De plus, voici quelques liens utiles: http://pandas.pydata.org/pandas-docs/dev/cookbook.html#hdfstore

+0

vous aviez raison avec la mise à niveau 0-11 pour obtenir le droit NaT. J'ai édité mon post en conséquence. Merci – user17375

Questions connexes