2015-02-27 9 views
8

Ho un 14MB Excel file with five worksheets che sto leggendo in un dataframe di Pandas e sebbene il codice sottostante funzioni, ci vogliono 9 minuti!Un modo più rapido di leggere i file Excel in dataframe panda

Qualcuno ha suggerimenti per accelerarlo?

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) 
+0

Puoi provare a salvare come csv e caricarlo, è possibile che il lettore Excel non sia veloce come quello csv – EdChum

+0

Ha più fogli di lavoro, anche se così non funzionerà? – jsignell

+1

Dovresti ancora essere in grado di salvare ogni foglio, sfortunatamente il dolore qui è che devi salvare ogni foglio separatamente, 14 MB non è una grande dimensione e il lettore csv lo mangerà molto velocemente. Un altro punto potrebbe essere quello di provare ['ExcelFile.parse'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.ExcelFile.parse.html#pandas.ExcelFile.parse) – EdChum

risposta

8

Come altri hanno suggerito, la lettura di csv è più veloce. Quindi se sei su Windows e hai Excel, puoi chiamare un vbscript per convertire Excel in csv e poi leggere il CSV. Ho provato la sceneggiatura di seguito e ci sono voluti circa 30 secondi.

# 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) 

Ecco un piccolo frammento di Python per creare lo script 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() 

Questa risposta beneficiato Convert XLS to CSV on command line e csv & xlsx files import to pandas data frame: speed issue

0

Se hai meno di 65536 righe (in ogni foglio) puoi provare xls (invece di xlsx. Nella mia esperienza xls è più veloce di xlsx. È difficile confrontare con csv perché e dipende dal numero di fogli.

Anche se questa non è una soluzione ideale (xls è un formato privativo vecchio binario), ho trovato è utile se si dispone di troppi fogli, formule interne con valori che sono spesso aggiornati, o per qualsiasi motivo per cui ti piacerebbe davvero che mantenga la funzionalità del multisheet excel.