更快速地将Excel文件读取到pandas数据帧

jsi*_*ell 23 python import-from-excel pandas

我有一个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)
Run Code Online (Sandbox Code Playgroud)

Ric*_*ell 21

正如其他人所说,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)
Run Code Online (Sandbox Code Playgroud)

这里有一小段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()
Run Code Online (Sandbox Code Playgroud)

这个答案得益于在命令行上将XLS转换为CSV并将 csv和xlsx文件导入到pandas数据框:速度问题

  • 如果在Linux上,解决方案是什么? (4认同)
  • 它给出了“TypeError:write()参数必须是str,而不是字节”的错误,所以我将其更改为f = open('ExcelToCsv.vbs','wb')。谢谢。 (3认同)

小智 21

我使用 xlsx2csv 在内存中虚拟地将 excel 文件转换为 csv,这有助于将读取时间减少大约一半。

from xlsx2csv import Xlsx2csv
from io import StringIO
import pandas as pd


def read_excel(path: str, sheet_name: str) -> pd.DataFrame:
    buffer = StringIO()
    Xlsx2csv(path, outputencoding="utf-8", sheet_name=sheet_name).convert(buffer)
    buffer.seek(0)
    df = pd.read_csv(buffer)
    return df
Run Code Online (Sandbox Code Playgroud)

  • 我尝试使用这段代码,但我认为它可能已经过时了,对于任何想要使用此代码的人,请尝试以下```from xlsx2csv import Xlsx2csv from io import StringIO from openpyxl import load_workbook import pandas as pd def read_excel(path: str,sheet_index: int) -&gt; pd.DataFrame: buffer = StringIO() Xlsx2csv(path, outputencoding="utf-8").convert(buffer,sheetid=sheet_index) buffer.seek(0) df = pd.read_csv(buffer, low_memory=假)返回 df``` (2认同)

tot*_*ico 5

如果每行中的行数少于65536行,则可以尝试xls(而不是xlsx。以我的经验xls,行速度比xlsx。快。csv由于要取决于页数,因此很难比较。

尽管这不是一个理想的解决方案(xls是二进制的旧私有格式),但我发现如果表太多,内部公式的值经常更新或出于任何原因想要保留excel,这很有用。多表功能


小智 5

根据我的经验,Pandasread_excel()可以很好地处理具有多个工作表的 Excel 文件。正如使用 Pandas 读取多个工作表中所建议的,如果您分配sheet_nameNone它,它将自动将每个工作表放入数据框中,并且它将输出带有工作表名称键的数据框字典。

但需要时间的原因是您在代码中解析文本的位置。14MB 的 excel 和 5 张纸并不算多。我有一个 20.1MB 的 Excel 文件,其中有 46 张纸,每张纸有超过 6000 行和 17 列,使用read_excel它的方式如下:

t0 = time.time()

def parse(datestr):
    y,m,d = datestr.split("/")
    return dt.date(int(y),int(m),int(d))

data = pd.read_excel("DATA (1).xlsx", sheet_name=None, encoding="utf-8", skiprows=1, header=0, parse_dates=[1], date_parser=parse)

t1 = time.time()

print(t1 - t0)
## result: 37.54169297218323 seconds
Run Code Online (Sandbox Code Playgroud)

上面的代码data是一个包含 46 个 Dataframe 的字典。

正如其他人所建议的,使用read_csv()可以有所帮助,因为读取.csv文件速度更快。但考虑到文件使用压缩的事实.xlsx.csv文件可能会更大,因此读取速度会更慢。但是,如果您想使用 python 将文件转换为逗号分隔文件(VBcode 由Rich Signel提供),您可以使用:将 xlsx 转换为 csv