Как я могу конвертировать дату Excel (в числовом формате) в соответствующую дату в Python?
Как читать дату в формате Excel в Python?
Ответ 1
Вы можете использовать xlrd.
Из документации вы можете прочитать, что даты всегда сохраняются как числа; однако вы можете использовать xldate_as_tuple
, чтобы преобразовать его в дату python.
Примечание: версия PyPI выглядит более актуальной, чем версия, доступная на веб-сайте xlrd.
Ответ 2
После тестирования и нескольких дней дождаться обратной связи, я буду 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)
)
Ответ 3
Здесь безголовые ремни без коляски используют вариант с собственным риском:
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
xlrd.xldate_as_tuple
хорош, но там xlrd.xldate.xldate_as_datetime
, который также преобразуется в datetime.
import xlrd
wb = xlrd.open_workbook(filename)
xlrd.xldate.xldate_as_datetime(41889, wb.datemode)
=> datetime.datetime(2014, 9, 7, 0, 0)
Ответ 5
Пожалуйста, обратитесь к этой ссылке: Дата чтения как строка, не плавающая с помощью 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
Ответ 6
Ожидаемая ситуация
# 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))
Что мое решение
Ответ 7
Если вы используете pandas, и ваш read_excel читает в формате даты, отформатированном как номера 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]')
Ответ 8
Excel хранит даты и время в виде числа, представляющего количество дней с 1900 года по январь-0. Если вы хотите получить даты в формате даты, используя python, просто вычтите 2 дня из столбца дней, как показано ниже:
Date = sheet.cell(1,0).value-2//в питоне
в столбце 1 моего приложения Excel у меня есть команда date и выше, которая дает мне значения даты минус 2 дня, что совпадает с датой, представленной в моем листе Excel
Ответ 9
Для быстрого и грязного:
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(excelDate, wb.datemode)
whatYouWant = str(month)+'/'+str(day)+'/'+str(year)
Ответ 10
Комбинация почты людей дала мне дату и время для конверсии 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")
Ответ 11
Так как есть вероятность, что ваши файлы Excel приходят с разных компьютеров/людей; есть вероятность, что форматирование будет грязным; так что будьте особенно осторожны.
Я только что импортировали данные из 50 нечетных первенствует где даты были заключены в формате DD/MM/YYYY
или DD-MM-YYYY
, но большинство файлов Excel хранятся их как MM/DD/YYYY
(Вероятно потому, что компьютеры были настроены с en-us
вместо en-gb
или en-in
).
Еще более раздражающим был тот факт, что даты выше 13/MM/YYYY
по-прежнему были в 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")
Ответ 12
Это пересмотренная версия от @hounds. Мой код обрабатывает и дату и время, что-то вроде 43705.591795706
import math
import datetime
def xldate_to_datetime(xldatetime): #something like 43705.6158241088
tempDate = datetime.datetime(1899, 12, 31)
(days, portion) = math.modf(xldatetime)
deltaDays = datetime.timedelta(days=days)
#changing the variable name in the edit
secs = int(24 * 60 * 60 * portion)
detlaSeconds = datetime.timedelta(seconds=secs)
TheTime = (tempDate + deltaDays + detlaSeconds )
return TheTime.strftime("%Y-%m-%d %H:%M:%S")
xldate_to_datetime(43705.6158241088)
# 2019-08-29 14:46:47
Ответ 13
При преобразовании файла excel в CSV ячейка даты/времени выглядит так:
foo, 3/16/2016 10:38, bar,
Чтобы преобразовать текстовое значение 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