Как использовать `` xlrd.xldate_as_tupple () ``
Вопрос
Я не совсем уверен, как использовать следующую функцию:
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))