Я не совсем уверен, как использовать следующую функцию:
xlrd.xldate_as_tuple
для следующих данных
xldate:39274.0
xldate:39839.0
Может кто-нибудь, пожалуйста, дайте мне пример об использовании функции для данных?
Я не совсем уверен, как использовать следующую функцию:
xlrd.xldate_as_tuple
для следующих данных
xldate:39274.0
xldate:39839.0
Может кто-нибудь, пожалуйста, дайте мне пример об использовании функции для данных?
Quoth документация:
Даты в электронных таблицах Excel
На самом деле таких вещей нет. У вас есть с плавающей запятой цифр и набожной надежды. Есть несколько проблем с датами Excel:
(1) Даты не сохраняются как отдельные тип данных; они хранятся как плавающие и вы должны полагаться на (а) "формат номера", применяемый к их в Excel и/или (b) зная, какие предполагается, что ячейки должны иметь даты в их. Этот модуль помогает с (а) проверки формата, который был применяется к каждой числовой ячейке; если оно представляется форматом даты, ячейка классифицируется как дата, а не номер. Обратная связь по этой функции, особенно от неанглоязычных локали, будут оценены.
(2) Excel для Windows хранит даты по по умолчанию - количество дней (или его фракции), поскольку 1899-12-31T00: 00: 00. Excel для Macintosh использует начальную дату по умолчанию 1904-01-01T00: 00: 00. Система даты могут быть изменены в Excel на для каждой рабочей книги (например: Инструменты → Параметры → Расчет, отметьте поле "Система дат 1904" ). Это конечно, плохая идея, если уже есть даты в книге. Здесь нет повод для его изменения, даже если в книге нет дат. Который используемая дата, записывается в книги. Переведенная книга от Windows до Macintosh (или наоборот) versa) будет корректно работать с хост Excel. При использовании этого модуля Функция xldate_as_tuple для преобразования номера из книги, вы должны использовать атрибут datemode книги объект. Если вы догадались или в зависимости от того, где вы верьте, что книга создана, вы рискует потерять 1462 дня из исправность.
Ссылка: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q180162
(3) Реализация Excel в Система дат, основанная на Windows-default 1900 работает над неправильной предпосылкой, что 1900 год был високосным. Он интерпретирует число 60 как значение 1900-02-29, который не является действительной датой. Следовательно, любое число меньше 61 является неоднозначным. Пример: 59 результат 1900-02-28 введен непосредственно, или это 1900-03-01 минус 2 дня? Программа OpenOffice.org Calc "исправляет" проблема Microsoft; входящий 1900-02-27 вызывает число 59 сохраняются. Сохраните файл XLS, затем откройте файл с Excel - вы увидите Отображено 1900-02-28.
Ссылка: http://support.microsoft.com/default.aspx?scid=kb;en-us;214326
который я цитирую здесь, потому что ответ на ваш вопрос, вероятно, будет неправильным, если вы не учтете это.
Таким образом, для этого в код будет что-то вроде:
import datetime
import xlrd
book = xlrd.open_workbook("myfile.xls")
sheet = book.sheet_by_index(0)
cell = sheet.cell(5, 19) # type, <class 'xlrd.sheet.Cell'>
if sheet.cell(5, 19).ctype == 3: # 3 means 'xldate' , 1 means 'text'
ms_date_number = sheet.cell_value(5, 19) # Correct option 1
ms_date_number = sheet.cell(5, 19).value # Correct option 2
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(ms_date_number,
book.datemode)
py_date = datetime.datetime(year, month, day, hour, minute, nearest_second)
который дает вам дату и время Python в py_date
, что вы можете делать полезные операции при использовании стандартного модуля datetime.
Я никогда не использовал xlrd, и мой пример полностью составлен, но если есть myfile.xls
, и у него действительно есть номер даты в ячейке F20, и вы не слишком суетливы относительно точности, как указано выше, этот код должен работать.
Документация функции (минус список возможных исключений):
xldate_as_tuple (xldate, datemode) [#]
Convert an Excel number (presumed to represent a date, a datetime or a time) into a tuple suitable for feeding to datetime or mx.DateTime constructors. xldate The Excel number datemode 0: 1900-based, 1: 1904-based. WARNING: when using this function to interpret the contents of a workbook, you should pass in the Book.datemode attribute of that workbook. Whether the workbook has ever been anywhere near a Macintosh is irrelevant. Returns: Gregorian (year, month, day, hour, minute, nearest_second).
Как автор xlrd, мне интересно узнать, как можно улучшить документацию. Не могли бы вы ответить на них:
Вы читали общий раздел о датах (цитируется @msw)?
Вы прочитали приведенную выше конкретную документацию функции?
Можете ли вы предложить какие-либо улучшения в документации?
Вы на самом деле пытались запустить функцию, например:
>>> import xlrd
>>> xlrd.xldate_as_tuple(39274.0, 0)
(2007, 7, 11, 0, 0, 0)
>>> xlrd.xldate_as_tuple(39274.0 - 1.0/60/60/24, 0)
(2007, 7, 10, 23, 59, 59)
>>>
Используйте его как такой:
number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)
import datetime as dt
import xlrd
log_dir = 'C:\\Users\\'
infile = 'myfile.xls'
book = xlrd.open_workbook(log_dir+infile)
sheet1 = book.sheet_by_index(0)
date_column_idx = 1
## iterate through the sheet to locate the date columns
for rownum in range(sheet1.nrows):
rows = sheet1.row_values(rownum)
## check if the cell is a date; continue otherwise
if sheet1.cell(rownum, date_column_idx).ctype != 3 :
continue
install_dt_tuple = xlrd.xldate_as_tuple((rows[date_column_idx ]), book.datemode)
## the "*date_tuple" will automatically unpack the tuple. Thanks mfitzp :-)
date = dt.datetime(*date_tuple)
Здесь я использую автоматическое преобразование дат:
cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3: # xldate
value = datetime.datetime(*xlrd.xldate_as_tuple(value, workbook.datemode))