J'ai un fichier/ 14MB Excel avec cinq feuilles de calcul que je lis dans un cadre de données Pandas, et bien que le code ci-dessous fonctionne, cela prend 9 minutes!
Quelqu'un a-t-il des suggestions pour l'accélérer?
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)
Comme d'autres l'ont suggéré, la lecture CSV est plus rapide. Donc, si vous êtes sur Windows et avez Excel, vous pouvez appeler un vbscript pour convertir Excel en csv puis lire le csv. J'ai essayé le script ci-dessous et cela a pris environ 30 secondes.
# 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)
Voici un petit extrait de python pour créer le 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()
Cette réponse a bénéficié de Convertir XLS en CSV en ligne de commande et Importation de fichiers csv et xlsx dans un cadre de données pandas: problème de vitesse
Si vous avez moins de 65 536 lignes (dans chaque feuille), vous pouvez essayer xls
(au lieu de xlsx
. Dans mon expérience, xls
est plus rapide que xlsx
. Il est difficile de comparer avec csv
car cela dépend du nombre de feuilles.
Bien que ce ne soit pas une solution idéale (xls
est un ancien format privatif binaire), j’ai trouvé cela utile si vous avez trop de feuilles, des formules internes avec des valeurs souvent mises à jour ou pour quelque raison que ce soit vous voudriez vraiment conserver la fonctionnalité de feuille de calcul Excel} _.
Je sais que c'est vieux, mais au cas où quelqu'un d'autre cherche une réponse qui n'implique pas VB. Pandas read_csv()
est plus rapide, mais vous n'avez pas besoin d'un script VB pour obtenir un fichier csv.
Ouvrez votre fichier Excel et enregistrez-le au format * .csv (valeurs séparées par des virgules).
Sous Outils, vous pouvez sélectionner Options Web et sous l'onglet Encodage, vous pouvez changer l'encodage en fonction de ce qui fonctionne pour vos données. J'ai fini par utiliser Windows, Europe occidentale, car l'encodage UTF de Windows est "spécial", mais il existe de nombreuses façons de réaliser la même chose. Ensuite, utilisez l’argument de codage dans pd.read_csv()
pour spécifier votre codage.
Les options de codage sont listées ici