Как преобразовать дату Excel (в числовом формате) в соответствующую дату в Python?Как узнать дату в формате Excel в Python?
ответ
Вы можете использовать xlrd.
Из documentation вы можете узнать, что даты всегда сохраняются в виде цифр; однако вы можете использовать xldate_as_tuple
, чтобы преобразовать его в дату python.
Примечание: версия PyPI выглядит более актуальной, чем версия, доступная на веб-сайте xlrd.
@ Роберто: спасибо за напоминание о сайте. –
После тестирования и нескольких дней ожидания обратной связи, я свяжусь со следующей новой функцией в модуле 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)
)
Привет @JohnMachin жаль возродить старую нить, но вы это сделали. Я на Ubuntu и python 2.7, и его нет в версии, которую я использую. –
Функция 'xldate_as_datetime' была добавлена в модуль' xldate' с версии xlrd 0.9.3 (выпущена в PyPI в апреле 2014 года). –
'xldate_as_datetime' является гораздо более чистым вариантом, чем' xldate_as_tuple', на мой взгляд. – Paco
Вот кулачный нет-ремней безопасности не использовать-в-собственном риски версии:
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)
)
. Для дат Excel Excel, основанных на 1900 году, это даёт неверные даты 'datetime' для Excel до 1 марта 1900 года. Это связано с ошибкой в Excel, которая делает это (неправильно) считают, что 1900 год был високосным. См. [Статья Microsoft KB] (http://support.microsoft.com/kb/214326) – Ben
И, кроме того, для очень не-компьютерно-научного предположения, что по какой-то причине начало года в 1900 году падает на 1 Как будто это Средневековье, и мы не поняли понятия 0; приветствует Microsoft. – AER
Для быстрых и грязные:
year, month, day, hour, minute, second = xlrd.xldate_as_tuple(excelDate, wb.datemode)
whatYouWant = str(month)+'/'+str(day)+'/'+str(year)
Пожалуйста, обратитесь к этой ссылке : 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
thx для копирования моего ответа;) – jojo
Надеюсь, что я не сделал здесь что-то не так, я просто хочу дать направление для правильного ответа здесь. –
Не беспокойтесь! Вероятно, было бы более адекватно поместить ссылку на дублированный вопрос в качестве комментария по этому вопросу, но, полагая, что это ответ, по крайней мере, для меня тоже прекрасен. – jojo
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)
Комбинированное сообщение людей дало мне дату и время для конверсии 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")
При преобразовании файла 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
OP хочет получить ответ для xlrd, так как xlrd возвращает в float –
Если вы используете панды, а ваш 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]')
Ожидаемая ситуация
# 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))
Это мое решение
- 1. узнать дату Gap Excel
- 2. Получить дату в определенном формате в python
- 3. Как сохранить дату в Excel в формате даты
- 4. Как преобразовать внутреннюю дату Oracle в дату Excel в Excel?
- 5. Как мне получить дату Python в формате, который я хочу?
- 6. Как удалить дату в формате ##/##/#### из строки в Python?
- 7. Скопировать дату из Excel в Word в другом формате
- 8. как конвертировать дату в другую дату в формате?
- 9. преобразовать # DateTime объект C в дату Excel формате
- 10. Как узнать дату сегодня?
- 11. CSV-файл в формате Excel не отображается
- 12. проверить дату в определенном формате
- 13. Как распечатать отчет в формате EXCEL (XLS)
- 14. Получить дату в формате 17.05.2012
- 15. Формат даты в формате Excel
- 16. Как проверить дату в формате США в Java
- 17. Как получить дату в дд формате/MM/YY с отметкой времени в Excel с помощью питона
- 18. получить дату в формате JS
- 19. Как конвертировать дату в другом формате?
- 20. Как показать дату в определенном формате
- 21. Как получить дату в определенном формате
- 22. Как преобразовать дату в формате даты тузд
- 23. MySQL: как отсортировать дату в формате RFC112?
- 24. Как показать дату в определенном формате?
- 25. Как получить дату сегодня в специальном формате?
- 26. Как отформатировать дату в заданном формате
- 27. Как вы разбираете дату в формате:
- 28. Как правильно создать дату в определенном формате?
- 29. Как разобрать дату в формате dd.mm.yyyy?
- 30. Как форматировать дату строки в другом формате?
Просьба уточнить: дать пример «данных Excel (в числовом формате) « –
Внутренне, Excel хранит даты как плавающие числа, и вы можете отличить от« нормальных »чисел только по размеру ячейки. –
@Roberto Liffredo, да, я знаю, что Excel хранит даты как плавающие числа, мне нужно преобразовать их в подходящую дату, и именно поэтому я задаю этот вопрос. @eliben, см. Комментарий Роберто – Grzenio