Считать дату из Excel в виде строки Python - PullRequest
1 голос
/ 03 марта 2020

Я понимаю, что об этом спрашивали несколько раз, но я не могу понять мою проблему, хотя я пробовал многие из приведенных ответов. Я пытаюсь прочитать ячейку Excel, которая представлена ​​в виде даты, но когда она импортируется в мою программу с помощью Python, она представляется в виде числа с плавающей запятой.

Четвертый столбец в моей электронной таблице Excel (т.е. index = 3) содержит все даты, которые я пытаюсь преобразовать из числа с плавающей точкой в ​​строку. Я просто добавляю все значения в список, чтобы что-то сделать со всей строкой, прежде чем очистить его и перейти к следующей строке.

Я основал свой код ниже из этого ответа: { ссылка }

Это пример данных, с которыми я работаю (файл):

enter image description here

import xlrd

workbook = xlrd.open_workbook(file)
worksheet = workbook.sheet_by_name('Sheet1')

num_rows = worksheet.nrows
num_cols = worksheet.ncols
values = []

i = 0
j = 0

while i < num_rows:
    while j < num_cols:
        if j == 3:
            values.append(xlrd.xldate_as_tuple(str(worksheet.cell_value(i, j)), 0))
        else:
            values.append(worksheet.cell_value(i, j))
        j += 1
    j = 0
    i += 1
    values = []

Однако, мой код выше дает мне следующую ошибку на print(xlrd.xldate_as_tuple(str(worksheet.cell_value(i, j)), 0)), и я не могу понять, почему.

TypeError: '<' не поддерживается между экземплярами 'str' и 'float' </p>

РЕДАКТИРОВАТЬ:

После отладки код выдает ошибку, где worksheet.cell_value (i, j) = 43588.0

EDIT2:

Я удалил str (...), приведенный вокруг Даты, чтобы включить: values.append(xlrd.xldate_as_tuple(worksheet.cell_value(i, j)), workbook.datemode), но это выдает ошибку:

Ошибка типа: xldate_as_tuple () отсутствует 1 обязательный позиционный аргумент: 'datemode'

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Я настоятельно рекомендую использовать pandas:

def read_db():
    data_list = []
    try:

        df = pd.read_excel(REVIEW_DB_URL, sheet_name='Sheet1')  # open the db
        for i in range(len(df)):
            data_list.append(df['name'][i], df['version'][i], df['datetime'][i],
            df['notes'][i])

        return data_list

    except Exception as e:
        print(e)
1 голос
/ 03 марта 2020

Я не думаю, что вы должны были считать дату в виде строки. Обратите внимание, что я сделал несколько других изменений:

  • используется для циклов вместо циклов while
  • , пожалуйста, не используйте имена переменных из одной буквы (например, i и j )
  • xldate_as_datetime имеет больше смысла, чем примечание xldate_as_tuple

, если вы хотите, чтобы дата отображалась в указанном формате c, попробуйте strftime

import xlrd

workbook = xlrd.open_workbook(file)
worksheet = workbook.sheet_by_name('Sheet1')

num_rows = worksheet.nrows
num_cols = worksheet.ncols
values = []

for row in range(1, num_rows):
    row_values = []
    for col in range(num_cols):
        if col == 3:
            datetime_ = xldate.xldate_as_datetime(worksheet.cell_value(row, col), workbook.datemode)
            row_values.append(datetime_)
        else:
            row_values.append(worksheet.cell_value(row, col))
    values.append(row_values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...