Вопрос

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

xlrd.xldate_as_tuple

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

xldate:39274.0
xldate:39839.0

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

Это было полезно?

Решение

Овладеть Документация:

Даты в электронные таблицы Excel

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

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

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

Ссылка: http://support.microsoft.com/default.aspx?scid=kb;en-us ;q180162.

(3) Реализация Excel на основе системы даты на основе Windows - по умолчанию работает на неверном помещении, что 1900 год был в виде скачкового года. Он интерпретирует номер 60 как значение 1900-02-29, что не является действительной датой. Следовательно, любое число менее 61 является неоднозначным. Пример: 59 результат 1900-02-28 введен напрямую, или это 1900-03-01 минус 2 дня? Программа Calc Calc OpenOffice.org «исправляет» проблему 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)

что дает вам datetime 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top