Быстрый способ читать файлы Excel для панды фрейма данных
У меня есть файл Excel размером 14 мб с пятью листами , который я читаю в фрейм данных Pandas, и хотя приведенный ниже код работает, он занимает 9 минут!
Есть ли у кого-нибудь предложения по его ускорению?import pandas as pd
def OTT_read(xl,site_name):
df = pd.read_excel(xl.io,site_name,skiprows=2,parse_dates=0,index_col=0,
usecols=[0,1,2],header=None,
names=['date_time','%s_depth'%site_name,'%s_temp'%site_name])
return df
def make_OTT_df(FILEDIR,OTT_FILE):
xl = pd.ExcelFile(FILEDIR + OTT_FILE)
site_names = xl.sheet_names
df_list = [OTT_read(xl,site_name) for site_name in site_names]
return site_names,df_list
FILEDIR='c:/downloads/'
OTT_FILE='OTT_Data_All_stations.xlsx'
site_names_OTT,df_list_OTT = make_OTT_df(FILEDIR,OTT_FILE)
2 ответа:
Как и предполагали другие, чтение csv происходит быстрее. Поэтому, если вы работаете в windows и имеете Excel, вы можете вызвать vbscript, чтобы преобразовать Excel в csv, а затем прочитать csv. Я попробовал сценарий ниже, и это заняло около 30 секунд.
# create a list with sheet numbers you want to process sheets = map(str,range(1,6)) # convert each sheet to csv and then read it using read_csv df={} from subprocess import call excel='C:\\Users\\rsignell\\OTT_Data_All_stations.xlsx' for sheet in sheets: csv = 'C:\\Users\\rsignell\\test' + sheet + '.csv' call(['cscript.exe', 'C:\\Users\\rsignell\\ExcelToCsv.vbs', excel, csv, sheet]) df[sheet]=pd.read_csv(csv)
Вот небольшой фрагмент python для создания ExcelToCsv.сценарий vbs:
#write vbscript to file vbscript="""if WScript.Arguments.Count < 3 Then WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file> <worksheet number (starts at 1)>" Wscript.Quit End If csv_format = 6 Set objFSO = CreateObject("Scripting.FileSystemObject") src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0)) dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1)) worksheet_number = CInt(WScript.Arguments.Item(2)) Dim oExcel Set oExcel = CreateObject("Excel.Application") Dim oBook Set oBook = oExcel.Workbooks.Open(src_file) oBook.Worksheets(worksheet_number).Activate oBook.SaveAs dest_file, csv_format oBook.Close False oExcel.Quit """; f = open('ExcelToCsv.vbs','w') f.write(vbscript.encode('utf-8')) f.close()
Этот ответ извлек выгоду из преобразования XLS в CSV в командной строке и импорта csv и xlsx файлов в фрейм данных pandas: проблема скорости
Если у вас меньше 65536 строк (на каждом листе), вы можете попробовать
xls
(вместоxlsx
. По моему опытуxls
быстрее, чемxlsx
. Это трудно сравнить сcsv
, потому что это зависит от количества листов.Хотя это не идеальное решение (
xls
- это двоичный старый Приватный формат), я нашел его полезным, если у вас слишком много листов , внутренние формулы со значениями, которые часто обновляются , или по какой-либо причине вы действительно хотели бы сохранить функциональность excel multisheet .