Как использовать `` xlrd.xldate_as_tuple () `` - PullRequest
18 голосов
/ 16 сентября 2010

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

xlrd.xldate_as_tuple

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

xldate:39274.0
xldate:39839.0

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

Ответы [ 5 ]

25 голосов
/ 16 сентября 2010

Квот документация :

Даты в таблицах Excel

На самом деле таких вещей нет.У вас есть числа с плавающей запятой и благочестивая надежда.С датами Excel есть несколько проблем:

(1) Даты не сохраняются как отдельный тип данных;они хранятся в виде чисел с плавающей запятой, и вы должны полагаться (а) на «формат чисел», применяемый к ним в Excel, и / или (б) знать, в каких ячейках должны быть даты.Этот модуль помогает с (a) проверкой формата, который был применен к каждой числовой ячейке;если это формат даты, ячейка классифицируется как дата, а не как число.Мы будем признательны за отзывы об этой функции, особенно из не говорящих по-английски языков.

(2) Excel для Windows по умолчанию сохраняет даты как количество дней (или их часть) с 1899-12-31T00: 00: 00.Excel для Macintosh использует дату начала по умолчанию 1904-01-01T00: 00: 00.Система дат может быть изменена в Excel для каждой книги (например: Инструменты -> Параметры -> Расчет, отметьте поле «Система дат 1904»).Это, конечно, плохая идея, если в рабочей книге уже есть даты.Нет веских причин для его изменения, даже если в рабочей книге нет дат.Какая система дат используется, записана в рабочей книге.Рабочая книга, перенесенная из Windows в Macintosh (или наоборот), будет корректно работать с хостом Excel.При использовании функции xldate_as_tuple этого модуля для преобразования чисел из рабочей книги необходимо использовать атрибут datemode объекта Book.Если вы угадываете или выносите суждение в зависимости от того, где, по вашему мнению, была создана рабочая книга, вы рискуете оказаться на расстоянии 1462 дня.

Ссылка: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q180162

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

8 голосов
/ 21 сентября 2010

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

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)
>>>
1 голос
/ 26 января 2016
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)
1 голос
/ 16 сентября 2010

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

number = 39274.0
book_datemode = my_book.datemode
year, month, day, hour, minute, second = xldate_as_tuple(number, book_datemode)
0 голосов
/ 13 сентября 2017

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

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