Как мне прочитать дату в формате Excel на Python? - PullRequest
51 голосов
/ 10 июля 2009

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

Ответы [ 12 ]

67 голосов
/ 10 июля 2009

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

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

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

25 голосов
/ 10 июля 2009

После тестирования и нескольких дней ожидания обратной связи, я svn-commit следующую совершенно новую функцию в модуле xlrd xldate ... обратите внимание, что она не будет доступна для приверженцев, все еще работающих на 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)
        )
24 голосов
/ 11 июля 2009

Вот вариант использования ремней безопасности без ремня безопасности на свой страх и риск:

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)
        )
20 голосов
/ 29 января 2015

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)
5 голосов
/ 07 октября 2014

Пожалуйста, обратитесь по этой ссылке: Чтение даты в виде строки, не плавающей из Excel с использованием 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 голосов
/ 16 июня 2017

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

# Wrong output from cell_values()
42884.0

# Expected output
2017-5-29

Пример: пусть cell_values ​​(2,2) из номера листа 0 будет датой целевой

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

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

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

1 голос
/ 18 апреля 2019

Excel хранит даты и время в виде числа, представляющего количество дней с 1900 года по январь-0. Если вы хотите получить даты в формате даты с использованием python, просто вычтите 2 дня из столбца дней, как показано ниже:

Date = sheet.cell (1,0) .value-2 // in python

в столбце 1 в моем Excel, у меня есть команда date и выше, которая дает мне значения даты минус 2 дня, что совпадает с датой, представленной в моем листе Excel

1 голос
/ 15 декабря 2016

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

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 голосов
/ 29 июля 2018

Так как есть вероятность, что ваши файлы Excel приходят с разных компьютеров / людей; есть вероятность, что форматирование будет грязным; так что будьте особенно осторожны.

Я только что импортировал данные из 50 странных исключений, где даты были введены в DD/MM/YYYY или DD-MM-YYYY, но большинство файлов Excel хранилось их как MM/DD/YYYY ( Вероятно, потому что ПК были настроены с en-us вместо en-gb или en-in).

Еще более раздражающим был тот факт, что даты выше 13/MM/YYYY все еще были в формате DD/MM/YYYY. Таким образом, в файлах Excel были различия.

Самым надежным решением, которое я нашел, было вручную установить для столбца «Дата» в каждом файле Excel значение «Простой текст», а затем использовать этот код для его анализа:

if date_str_from_excel:
    try:
        return datetime.strptime(date_str_from_excel, '%d/%m/%Y')
    except ValueError:
        print("Unable to parse date")
0 голосов
/ 16 марта 2016

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

foo, 16.03.2016 10:38, бар,

Чтобы преобразовать текстовое значение datetime в объект python datetime, сделайте следующее:

from datetime import datetime

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

print date_object вернется 2005-06-01 13: 33: 00

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...