Более быстрый способ чтения файлов Excel в Pandas dataframe

У меня есть 14mb Excel файл с пятью листами что я читаю в фрейм данных 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 является двоичным старым приватным форматом), я нашел его полезным, если у вас есть слишком много листов внутренние формулы со значениями, которые часто обновляется!--10-->, или для чего угодно причина, по которой вы действительно хотели бы сохранить функциональность Excel multisheet.