web-dev-qa-db-fra.com

KeyError: <class 'pandas._libs.tslibs.timestamps.Timestamp'> lors de l'enregistrement d'un fichier de données dans Excel

Bonjour, J'utilise python depuis environ un an et demi et je me trouve face à un problème fondamental que je ne parviens pas à résoudre. 

J'ai un simple dataframe (df), pas grand (environ 12k lignes et 10 colonnes) qui inclut une colonne au format "datetime64 [ns]", un "float64" et tous les autres sont "object". J'ai débogué et peux dire que l'erreur vient de la colonne datetime.

Lorsque je sauvegarde ce fichier dans Excel, je reçois le message suivant:

Fichier "test.py", ligne 16, dans test.to_Excel (writer, 'test') Fichier "C:\Utilisateurs\renaud.viot\AppData\Local\Programmes\Python\Python36\lib\site-packages\pandas\core\frame.py", ligne 1766, dans to_Excel engine = engine) Fichier "C:\Utilisateurs\renaud.viot\AppData\Programmes\Python\Python36\lib\site-packages\pandas\io\formats\Excel.py", ligne 652, en écriture freeze_panes = freeze_panes) Fichier "C:\Utilisateurs\renaud.viot\AppData\Local\Programmes\Python\Python36\lib\site-packages\pandas\io\Excel.py", ligne 1395, dans write_cells xcell.value, fmt = self._value_with_fmt (cell.val) Fichier "C:\Utilisateurs\renaud.viot\AppData\Local\Programmes\Python\Python36\lib\site-packages\openpyxl\cell\cell.py", ligne 291, en valeur self._bind_value (value) Fichier "C:\Utilisateurs\renaud.viot\AppData\Local\Programmes\Python\Python36\lib\site-packages\openpyxl\cell\cell.py", ligne 193, dans _bind_value self._set_time_format (valeur) Fichier "C:\Utilisateurs\renaud.viot\AppData\Local\Programmes\Python\Python36\lib\site-packages\openpyxl\cell\cell.py", ligne 277, dans _set_time_format self.number_format = fmts [type (valeur)] KeyError: 

Le morceau de code que j'utilise est le suivant:

import pandas as pd
import datetime
from pandas import ExcelWriter

test = pd.read_Excel("test_in.xlsx")
test["CaseDate"] = pd.to_datetime(test["CaseDate"])
writer = ExcelWriter("test_out.xlsx")
test.to_Excel(writer,'test')
writer.save()

Veuillez voir ci-dessous l'exemple des données:

>    A   CaseDate 
> 0  A 2018-08-30 
> 1  A 2018-08-30 
> 2  A 2018-08-30 
> 3  A 2018-08-30 
> 4  A 2018-08-30 
> 5  A 2018-08-30 
> 6  A 2018-08-30 
> 7  A 2018-08-30 
> 8  A 2018-08-30 
> 9  A 2018-08-30

Il doit y avoir quelque chose d’évident .... Merci de votre aide ...... BR, .__ Renaud

6
rvaux

J'avais le même problème dans mon projet. Je ne comprenais pas pourquoi cette erreur se produisait mais j'ai trouvé une solution. 

Je crois que cette erreur est liée au module openpyxl. Pandas l'utilise comme moteur pour exporter les données sous forme de fichier Excel. Lorsque vous nommez le fichier avec une extension .xlsx, la classe ExcelWritter utilise automatiquement openpyxl comme moteur par défaut.

Ce que j'ai fait est de changer ce moteur. Vous pouvez passer un paramètre à ExcelWritter en appelant un nouveau moteur (xlsxwriter) pour exporter le cadre de données. 

Donc mon code a changé de:

writer = pd.ExcelWriter('output.xlsx')
df.to_Excel(writer, 'data')
writer.save()

à celui-ci:

writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
df.to_Excel(writer, sheet_name='data')
writer.save()

Si le module xlsxwriter n'est pas installé dans votre environnement, utilisez simplement pip install xlsxwriter et ensuite, exécutez votre code.

Cela devrait résoudre votre problème aussi. 

6
Arnold Souza

J'ai eu le même problème avec les pandas 0.23.4 et openpyxl 2.5.6. J'ai mis à jour (en utilisant conda update openpyxl) à 2.5.8 et le problème est parti.

1
Mike Gleen