J'espère ne pas créer de doublon mais j'ai regardé autour de moi (débordement de pile et autre forum) et j'ai trouvé une question similaire mais aucune d'elles n'a résolu mon problème.
J'ai un code python qui est la seule chose qui fait est d'interroger la base de données, de créer un DataFrame dans Pandas et de l'écrire dans un fichier Excel.
Le code fonctionnait sans problème localement mais quand je l'ai introduit dans mon serveur, il a commencé à donner cette erreur: p >
pivot = pd.DataFrame.from_dict(pivot) #pivot= information extracted from DB pd.to_numeric(pivot['Count_of_HostName'], downcast='signed')#try to enforce to be a numeric value in case it get confused with a datetime pd.to_numeric(pivot['Disk_Total_Size'], downcast='signed')#try to enforce to be a numeric value in case it get confused with a datetime pd.to_numeric(pivot['Computer_System_Memory_Size'], downcast='signed')#try to enforce to be a numeric value in case it get confused with a datetime pd.to_numeric(pivot['Number_of_CPU'], downcast='signed')#try to enforce to be a numeric value in case it get confused with a datetime print pivot name = 'TempReport/Report.xlsx'#set-up file name writer = pd.ExcelWriter(name, engine='xlsxwriter')#create excel with file name pivot.to_excel(writer, 'Pivot', index=False)#introduce my data to excel writer.save()#write to file, it's where it fail
Pour m'assurer que tout va bien, j'ai imprimé mon DataFrame et pour moi il a l'air bien même parce que lorsque je l'exécute localement, il génère un fichier excell sans problème:
Computer_System_Memory_Size Count_of_HostName Disk_Total_Size Number_of_CPU OS_Family 0 5736053088256 70 6072238035456 282660 Windows 1 96159653888 607 96630589440 2451066 vCenter 2 0 9 0 36342 Virtualization 3 2469361287143424 37 2389533519619072 149406 Unix 4 3691651514368 90 5817485303808 363420 Linux
Je ne vois aucun horodatage ici et cela fait partie de mon code:
File "Test.py", line 34, in <module> test() File "Test.py", line 31, in test ex.generate_file() File "/home/carlo/Test/Utility/ExportExcell.py", line 96, in generate_file writer.save() File "/usr/local/lib/python2.7/dist-packages/pandas/io/excel.py", line 1952, in save return self.book.close() File "/usr/local/lib/python2.7/dist-packages/xlsxwriter/workbook.py", line 306, in close self._store_workbook() File "/usr/local/lib/python2.7/dist-packages/xlsxwriter/workbook.py", line 677, in _store_workbook xlsx_file.write(os_filename, xml_filename) File "/usr/lib/python2.7/zipfile.py", line 1135, in write zinfo = ZipInfo(arcname, date_time) File "/usr/lib/python2.7/zipfile.py", line 305, in __init__ raise ValueError('ZIP does not support timestamps before 1980') ValueError: ZIP does not support timestamps before 1980
Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas dans un Serveur Ubuntu 16.04 sans me donner l'erreur «ZIP ne prend pas en charge les horodatages avant 1980»? J'ai vérifié beaucoup de choses, version de la bibliothèque, m'assurer qu'il n'y a pas de données
3 Réponses :
XlsxWriter a défini les fichiers XML individuels qui composent un fichier XLSX avec une date de création du 1/1/1980 qui est (je pense) l'époque ZIP et la date utilisée par Excel. Cela permet la reproductibilité binaire des fichiers créés par XlsxWriter une fois que les mêmes données d'entrée et métadonnées sont utilisées.
Il définit la date comme suit (pour le cas zipfile.py non en mémoire):
import os import time filename = 'file.txt' file = open(filename, 'w') file.close() timestamp = time.mktime((1980, 1, 1, 0, 0, 0, 0, 0, 0)) os.utime(filename, (timestamp, timestamp)) print(time.ctime(os.path.getmtime(filename))) # Should give: # Tue Jan 1 00:00:00 1980
L'erreur que vous voyez se produit lorsque cela échoue d'une manière ou d'une autre et que la date est définie avant le 1/1/1980.
Je n'ai vu cela se produire qu'une situation où l'utilisateur utilisait un conteneur et le conteneur avait une heure différente de celle du système hôte.
Avez-vous une situation comme celle-ci ou où l'horodatage peut être mal défini pour une raison quelconque?
Mise à jour: essayez de l'exécuter dans le même environnement que l'exemple qui échoue:
timestamp = time.mktime((1980, 1, 1, 0, 0, 0, 0, 0, 0)) os.utime(os_filename, (timestamp, timestamp))
Mise à jour : ce problème est résolu dans XlsxWriter> = 1.1.9.
Salut jmcnamara, je n'ai pas de situation étrange, avant même d'avoir un autre programme exporté vers Excel qui a également cessé de fonctionner mais j'ai mon serveur dans le même fuseau horaire que ma VM locale et mon réseau, donc je ne suis pas sûr pourquoi cela se produit; en tout cas je l'essayerai au plus vite et je te ferai savoir si ça marche;) Merci beaucoup pour ton aide
Je viens donc d'éditer mon code pour présenter vos modifications et il m'imprime "Mon Dec 31 23:00:00 1979" donc avec votre code je peux voir le problème mais je ne sais pas comment le résoudre: SI essayez de faire "timestamp = time.mktime ((1982, 1, 1, 0, 0, 0, 0, 0, 0))" mais quand j'exécute mon code, il échoue quand même
Si vous définissez le dernier élément du tuple sur -1 dans l'exemple ci-dessus, c'est-à-dire (1980, 1, 1, 0, 0, 0, 0, 0, -1)
., Quelle sortie obtenez-vous?
quand je l'imprime, j'obtiens "Tue Jan 1 00:00:00 1980" mais échoue quand même: Fichier "/usr/lib/python2.7/zipfile.py", ligne 305, dans init b > augmenter ValueError ('ZIP ne prend pas en charge les horodatages avant 1980') ValueError: ZIP ne prend pas en charge les horodatages avant 1980
Le code supplémentaire est juste pour le débogage. Cela ne résout pas le problème. Vous devrez effectuer la modification (0 -> -1) dans le code XlsxWriter workbook.py ici .
Je vais pousser un correctif sur le Github XlsxWriter. Pourriez-vous l'installer à partir de là et le tester sur votre système?
Aussi, avant de modifier quoi que ce soit sur votre système, vous pouvez installer le module python pytz
et essayer de réexécuter votre exemple.
continuons cette discussion dans le chat .
J'ai résolu le problème même en obtenant la nouvelle version de la bibliothèque XlsxWriter
Essayez d'utiliser ce moteur:
pd.to_excel('file_name.xlsx', engine = 'openpyxl')
@GiulioCaccin la fonction 'to_excel' peut fonctionner avec deux options différentes pour le moteur d'argument. La valeur par défaut est «xlsxwriter», mais vous pouvez définir l'option «openpyxl». J'avais le même problème dans Windows 10, Python 3.7 et Anaconda 1.9.7. Cependant, avec engine = 'openpyxl', le code fonctionne correctement.
<₹ Ce problème est résolu dans XlsxWriter 1.2.1!
Ce problème est résolu dans XlsxWriter 1.2.1!