2015-02-27 20 views
8

Tôi có một 14MB Excel file with five worksheets mà tôi đang đọc vào một khung dữ liệu Pandas và mặc dù mã bên dưới hoạt động, phải mất 9 phút!Cách nhanh hơn để đọc các tệp Excel vào khung dữ liệu pandas

Có ai có đề xuất để tăng tốc nó không?

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

Bạn có thể thử lưu dưới dạng csv và tải nó, có thể trình đọc excel không nhanh bằng csv – EdChum

+0

Nó có nhiều trang tính mặc dù vậy sẽ không hoạt động? – jsignell

+1

Bạn vẫn có thể lưu từng trang, thật không may, nỗi đau ở đây là bạn phải lưu từng trang riêng biệt, 14MB không phải là kích thước lớn và trình đọc csv sẽ ăn nhanh hết. Một điểm khác có thể thử ['ExcelFile.parse'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.ExcelFile.parse.html#pandas.ExcelFile.parse) – EdChum

Trả lời

8

Như những người khác đã đề xuất, đọc csv nhanh hơn. Vì vậy, nếu bạn đang ở trên các cửa sổ và có Excel, bạn có thể gọi một vbscript để chuyển đổi Excel sang csv và sau đó đọc csv. Tôi đã thử kịch bản bên dưới và mất khoảng 30 giây.

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

Dưới đây là một chút đoạn python để tạo ra các ExcelToCsv.vbs kịch bản:

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

Câu trả lời này được hưởng lợi từ Convert XLS to CSV on command linecsv & xlsx files import to pandas data frame: speed issue

0

Nếu bạn có ít hơn 65.536 hàng (trong mỗi tấm) bạn có thể thử xls (thay vì xlsx. Theo kinh nghiệm của tôi xls nhanh hơn xlsx. Rất khó để so sánh với csv becaus e nó phụ thuộc vào số lượng tờ.

Mặc dù đây không phải là một giải pháp lý tưởng (xls là một định dạng PRIVATIVE cũ nhị phân), tôi đã tìm thấy nó rất hữu ích nếu bạn có quá nhiều trang, công thức nội với giá trị được cập nhật thường xuyên, hoặc cho bất cứ điều gì lý do bạn thực sự muốn giữ chức năng multisheet excel.

Các vấn đề liên quan