Как проверить в какой тип возможно преобразовать переменную Python
Всем привет, столкнулся с такой проблемой. Я считываю файл Excel, в котором имеются данные разных типов (Дата, Число, Число с плавающей запятой и Строка). Считываю при помощи библиотеки xlrd, и разумеется все данные считываются в строку. Далее, мне необходимо преобразовать эту строку, в тот тип данных, в котором они были в Excel, другими словами, мне необходимо проверить, возможно ли преобразовать считанную строку в int, float или datetime. Я написал вот такой код, и он работает.
workbook = xlrd.open_workbook('input.xlsx', 0)
sh = workbook.sheet_by_index(0)
for i in range(11, 12):
for j in range(sh.ncols - 1):
cll = sh.cell_value(rowx=i, colx=j)
try:
# Сначала проверяем можно ли сделать из этого дату старше 2010 года
# Если да, то записываем
if xlrd.xldate.xldate_as_datetime(sh.cell_value(rowx=i, colx=j), workbook.datemode).year > 2010:
cll = xlrd.xldate.xldate_as_datetime(sh.cell_value(rowx=i, colx=j), workbook.datemode)
else:
raise TypeError
except TypeError:
try:
# Теперь проверяем можно ли из этого сделать Int
cll = int(sh.cell_value(rowx=i, colx=j))
except ValueError:
try:
# Теперь проверяем, можно ли из этого сделать Float
cll = float(sh.cell_value(rowx=i, colx=j))
except ValueError:
# Если ничего не получилось, оставляем строкой
cll = str(cll)
print(cll, type(cll))
Однако, я думаю этот код можно написать как нибудь проще, тем более, количество разных типов может увеличиться, и придется еще и еще увеличивать уровень вложенности. Подскажите, возможно ли как - нибудь проще реализовать проверку, в какой тип данных возможно преобразовать строковую переменную? Заранее спасибо всем за ответы.
Ответы (1 шт):
Откройте для себя Pandas:
import pandas as pd
df = pd.read_excel("filename.xlsx")
print(df) # данные
print(df.dtypes) # типы данных столбцов
PS Pandas хорошо угадывает правильные типы данных столбцов для числовых и строковых данных. Для дат нужно указать список наименований столбцов, которые нужно парсить как дату/время:
df = pd.read_excel("filename.xlsx", parse_dates=[0,3,5]) # Pandas попытается спарсить столбцы 1, 4 и 6 как дату/время