Подтвердить что ты не робот

Как использовать `` xlrd.xldate_as_tuple() ``

Я не совсем уверен, как использовать следующую функцию:

xlrd.xldate_as_tuple

для следующих данных

xldate:39274.0
xldate:39839.0

Может кто-нибудь, пожалуйста, дайте мне пример об использовании функции для данных?

4b9b3361

Ответ 1

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, и вы не слишком суетливы относительно точности, как указано выше, этот код должен работать.

Ответ 2

Документация функции (минус список возможных исключений):

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

Ответ 3

Используйте его как такой:

number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)

Ответ 4

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)

Ответ 5

Здесь я использую автоматическое преобразование дат:

cell = sheet.cell(row, col)
value = cell.value
if cell.ctype == 3:  # xldate
    value = datetime.datetime(*xlrd.xldate_as_tuple(value, workbook.datemode))