Запись данных в Excel дает мне «ZIP не поддерживает временные метки до 1980 года» - PullRequest
0 голосов
/ 07 февраля 2019

Я надеюсь не создавать дубликатов, но я осмотрелся (переполнение стека и другие форумы), и я нашел какой-то похожий вопрос, но ни один из них не решил мою проблему.

У меня есть код Python, которыйединственное, что делает, это запрашивает БД, создает DataFrame в Pandas и записывает его в файл Excel.

Код работал без проблем локально, но когда я представил его на своем сервере, он начал выдавать эту ошибку:

  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

Чтобы убедиться, что все в порядке, я распечатал свой DataFrame, и для меня он выглядит хорошо даже потому, что когда я запускаю его локально, он без проблем создает отличный файл:

   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

Я не знаюя не вижу здесь отметки времени, и это часть моего кода:

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

Кто-то знает, почему он не работает на сервере Ubuntu 16.04 без сообщения «ZIP не поддерживает отметки времени до 1980»??Я проверил много вещей, версия библиотеки, убедитесь, что нет данных

Ответы [ 2 ]

0 голосов
/ 15 августа 2019

Попробуй использовать этот движок:

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

Да, да. Это сработало для меня, спасибо !!

0 голосов
/ 07 февраля 2019

XlsxWriter устанавливает отдельные XML-файлы, составляющие XLSX-файл, с датой создания 01.01.1980, которая (я думаю) является эпохой ZIP и датой, используемой в Excel.Это обеспечивает двоичную воспроизводимость файлов, созданных XlsxWriter, когда используются одни и те же входные данные и метаданные.

Устанавливает дату следующим образом (для не в памяти zipfile.py) case:

timestamp = time.mktime((1980, 1, 1, 0, 0, 0, 0, 0, 0))
os.utime(os_filename, (timestamp, timestamp))

Ошибка, которую вы видите, возникает, когда это каким-то образом дает сбой, а дата установлена ​​до 1/1 / 1980.

Я видел это только один раз в ситуации, когда пользовательиспользовала контейнер, и контейнер имел время, отличное от хост-системы.

Есть ли у вас ситуация, подобная этой, или по какой-то причине временная метка может быть установлена ​​неправильно?

Обновление: Попробуйтезапустите его в той же среде, что и в примере, который дает сбой:

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

Обновление : эта проблема исправлена ​​в XlsxWriter> = 1.1.4.

...