web-dev-qa-db-fra.com

Un moyen plus rapide de lire des fichiers Excel dans un fichier de données de pandas

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)
17
jsignell

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

15
Rich Signell

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} _.

3
toto_tico

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

0
kirby