5
votes

L'écriture de données dans Excel me donne «ZIP ne prend pas en charge les horodatages avant 1980»

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


1 commentaires

Ce problème est résolu dans XlsxWriter 1.2.1!


3 Réponses :


3
votes

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.


9 commentaires

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 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



1
votes

Essayez d'utiliser ce moteur:

pd.to_excel('file_name.xlsx', engine = 'openpyxl')


1 commentaires

@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.



1
votes

<₹ Ce problème est résolu dans XlsxWriter 1.2.1!


0 commentaires