更快速地将Excel文件读取到pandas datafram

2024-03-29 13:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个14MB Excel file with five worksheets正在读入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)

Tags: namedfreadmakereturnnamesdefsite
3条回答

如果每个工作表中少于65536行,可以尝试xls(而不是xlsx)。以我的经验来看,xlsxlsx快。很难与csv进行比较,因为它取决于纸张的数量。

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

我知道这是旧的,但如果其他人正在寻找一个不涉及VB的答案。Pandasread_csv()速度更快,但您不需要VB脚本来获取csv文件。

打开Excel文件并另存为*.csv(逗号分隔值)格式。

在“工具”下,可以选择“Web选项”,在“编码”选项卡下,可以将编码更改为适用于数据的任何内容。我最终使用了西欧的Windows,因为Windows UTF编码是“特殊的”,但是有很多方法可以完成同样的事情。然后使用pd.read_csv()中的encoding参数指定编码。

列出了编码选项here

正如其他人所建议的,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)

下面是创建ExcelToCsv.vbs脚本的一小段python:

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

这个答案得益于Convert XLS to CSV on command linecsv & xlsx files import to pandas data frame: speed issue

相关问题 更多 >