2009-07-10 6 views
44

Как преобразовать дату Excel (в числовом формате) в соответствующую дату в Python?Как узнать дату в формате Excel в Python?

+0

Просьба уточнить: дать пример «данных Excel (в числовом формате) « –

+5

Внутренне, Excel хранит даты как плавающие числа, и вы можете отличить от« нормальных »чисел только по размеру ячейки. –

+1

@Roberto Liffredo, да, я знаю, что Excel хранит даты как плавающие числа, мне нужно преобразовать их в подходящую дату, и именно поэтому я задаю этот вопрос. @eliben, см. Комментарий Роберто – Grzenio

ответ

62

Вы можете использовать xlrd.

Из documentation вы можете узнать, что даты всегда сохраняются в виде цифр; однако вы можете использовать xldate_as_tuple, чтобы преобразовать его в дату python.

Примечание: версия PyPI выглядит более актуальной, чем версия, доступная на веб-сайте xlrd.

+0

@ Роберто: спасибо за напоминание о сайте. –

24

После тестирования и нескольких дней ожидания обратной связи, я свяжусь со следующей новой функцией в модуле xldate xlrd ... обратите внимание, что она не будет доступна для всех накопителей Python 2.1 или 2.2.

## 
# Convert an Excel number (presumed to represent a date, a datetime or a time) into 
# a Python datetime.datetime 
# @param xldate The Excel number 
# @param datemode 0: 1900-based, 1: 1904-based. 
# <br>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. 
# @return a datetime.datetime object, to the nearest_second. 
# <br>Special case: if 0.0 <= xldate < 1.0, it is assumed to represent a time; 
# a datetime.time object will be returned. 
# <br>Note: 1904-01-01 is not regarded as a valid date in the datemode 1 system; its "serial number" 
# is zero. 
# @throws XLDateNegative xldate < 0.00 
# @throws XLDateAmbiguous The 1900 leap-year problem (datemode == 0 and 1.0 <= xldate < 61.0) 
# @throws XLDateTooLarge Gregorian year 10000 or later 
# @throws XLDateBadDatemode datemode arg is neither 0 nor 1 
# @throws XLDateError Covers the 4 specific errors 

def xldate_as_datetime(xldate, datemode): 
    if datemode not in (0, 1): 
     raise XLDateBadDatemode(datemode) 
    if xldate == 0.00: 
     return datetime.time(0, 0, 0) 
    if xldate < 0.00: 
     raise XLDateNegative(xldate) 
    xldays = int(xldate) 
    frac = xldate - xldays 
    seconds = int(round(frac * 86400.0)) 
    assert 0 <= seconds <= 86400 
    if seconds == 86400: 
     seconds = 0 
     xldays += 1 
    if xldays >= _XLDAYS_TOO_LARGE[datemode]: 
     raise XLDateTooLarge(xldate) 

    if xldays == 0: 
     # second = seconds % 60; minutes = seconds // 60 
     minutes, second = divmod(seconds, 60) 
     # minute = minutes % 60; hour = minutes // 60 
     hour, minute = divmod(minutes, 60) 
     return datetime.time(hour, minute, second) 

    if xldays < 61 and datemode == 0: 
     raise XLDateAmbiguous(xldate) 

    return (
     datetime.datetime.fromordinal(xldays + 693594 + 1462 * datemode) 
     + datetime.timedelta(seconds=seconds) 
     ) 
+2

Привет @JohnMachin жаль возродить старую нить, но вы это сделали. Я на Ubuntu и python 2.7, и его нет в версии, которую я использую. –

+2

Функция 'xldate_as_datetime' была добавлена ​​в модуль' xldate' с версии xlrd 0.9.3 (выпущена в PyPI в апреле 2014 года). –

+0

'xldate_as_datetime' является гораздо более чистым вариантом, чем' xldate_as_tuple', на мой взгляд. – Paco

21

Вот кулачный нет-ремней безопасности не использовать-в-собственном риски версии:

import datetime 

def minimalist_xldate_as_datetime(xldate, datemode): 
    # datemode: 0 for 1900-based, 1 for 1904-based 
    return (
     datetime.datetime(1899, 12, 30) 
     + datetime.timedelta(days=xldate + 1462 * datemode) 
     ) 
+4

. Для дат Excel Excel, основанных на 1900 году, это даёт неверные даты 'datetime' для Excel до 1 марта 1900 года. Это связано с ошибкой в ​​Excel, которая делает это (неправильно) считают, что 1900 год был високосным. См. [Статья Microsoft KB] (http://support.microsoft.com/kb/214326) – Ben

+2

И, кроме того, для очень не-компьютерно-научного предположения, что по какой-то причине начало года в 1900 году падает на 1 Как будто это Средневековье, и мы не поняли понятия 0; приветствует Microsoft. – AER

0

Для быстрых и грязные:

year, month, day, hour, minute, second = xlrd.xldate_as_tuple(excelDate, wb.datemode) 
whatYouWant = str(month)+'/'+str(day)+'/'+str(year) 
4

Пожалуйста, обратитесь к этой ссылке : Reading date as a string not float from excel using python xlrd

это сработало для меня:

в кадре это ссылка имеет:

import datetime, xlrd 
book = xlrd.open_workbook("myfile.xls") 
sh = book.sheet_by_index(0) 
a1 = sh.cell_value(rowx=0, colx=0) 
a1_as_datetime = datetime.datetime(*xlrd.xldate_as_tuple(a1, book.datemode)) 
print 'datetime: %s' % a1_as_datetime 
+2

thx для копирования моего ответа;) – jojo

+0

Надеюсь, что я не сделал здесь что-то не так, я просто хочу дать направление для правильного ответа здесь. –

+0

Не беспокойтесь! Вероятно, было бы более адекватно поместить ссылку на дублированный вопрос в качестве комментария по этому вопросу, но, полагая, что это ответ, по крайней мере, для меня тоже прекрасен. – jojo

17

xlrd.xldate_as_tuple это хорошо, но есть xlrd.xldate.xldate_as_datetime, который преобразует значения в дату, а также.

import xlrd 
wb = xlrd.open_workbook(filename) 
xlrd.xldate.xldate_as_datetime(41889, wb.datemode) 
=> datetime.datetime(2014, 9, 7, 0, 0) 
0

Комбинированное сообщение людей дало мне дату и время для конверсии excel. Я сделал вернуть его в виде строки

def xldate_to_datetime(xldate): 
    tempDate = datetime.datetime(1900, 1, 1) 
    deltaDays = datetime.timedelta(days=int(xldate)) 
    secs = (int((xldate%1)*86400)-60) 
    detlaSeconds = datetime.timedelta(seconds=secs) 
    TheTime = (tempDate + deltaDays + detlaSeconds) 
    return TheTime.strftime("%Y-%m-%d %H:%M:%S") 
-1

При преобразовании файла Excel в CSV даты/времени ячейка выглядит следующим образом:

Foo, 3/16/2016 10:38, бар,

Для преобразования даты и время текстового значения даты и время объекта питона сделать это:

from datetime import datetime 

date_object = datetime.strptime('3/16/2016 10:38', '%m/%d/%Y %H:%M') # excel format (CSV file) 

печати date_object будет возвращать 2005-06-01 13:33:00

+0

OP хочет получить ответ для xlrd, так как xlrd возвращает в float –

1

Если вы используете панды, а ваш read_excel читает в формате даты, отформатированном как номера Excel, неправильно, и вам нужно восстановить реальные даты позади ...

The lambda function наносили на колонку использует xlrd восстановить дату назад

import xlrd 
df['possible_intdate'] = df['possible_intdate'].apply(lambda s: xlrd.xldate.xldate_as_datetime(s, 0)) 


>> df['possible_intdate'] 

    dtype('<M8[ns]') 
0

Ожидаемая ситуация

# Wrong output from cell_values() 
42884.0 

# Expected output 
2017-5-29 

Пример: Пусть cell_values ​​(2,2) из числа листов будет указываться дата

Получить необходимые переменные в качестве следующего

workbook = xlrd.open_workbook("target.xlsx") 

sheet = workbook.sheet_by_index(0) 

wrongValue = sheet.cell_value(2,2) 

и использовать xldate_as_tuple

y, m, d, h, i, s = xlrd.xldate_as_tuple(wrongValue, workbook.datemode) 
print("{0} - {1} - {2}".format(y, m, d)) 

Это мое решение

Смежные вопросы