Как сократить время на чтение xlsx и преобразовать его в csv в pandas на большом наборе данных? [Дубликат]

Неглубокая копия с одним слоем ( 5-е издание ECMAScript ):

var origin = { foo : {} };
var copy = Object.keys(origin).reduce(function(c,k){c[k]=origin[k];return c;},{});

console.log(origin, copy);
console.log(origin == copy); // false
console.log(origin.foo == copy.foo); // true

И мелкая копия с одним слоем ( ECMAScript 6-е издание , 2015 ):

var origin = { foo : {} };
var copy = Object.assign({}, origin);

console.log(origin, copy);
console.log(origin == copy); // false
console.log(origin.foo == copy.foo); // true

12
задан Rich Signell 27 February 2015 в 15:20
поделиться

2 ответа

Как показали другие, чтение 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:

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

Этот ответ выиграл от Преобразование XLS в CSV в командной строке и csv & amp; Импорт файлов xlsx в кадр данных pandas: проблема с скоростью

10
ответ дан Community 21 August 2018 в 04:01
поделиться

Если у вас меньше 65536 строк (на каждом листе), вы можете попробовать xls (вместо xlsx. По моему опыту xls быстрее, чем xlsx. Трудно сравнить с csv потому что это зависит от количества листов.

Хотя это не идеальное решение (xls - двоичный старый приватный формат), я нашел, что это полезно, если у вас слишком много листов, внутренние формулы со значениями, которые часто обновляются или по какой-либо причине вы действительно хотели бы сохранить функциональность excel multisheet.

0
ответ дан toto_tico 21 August 2018 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: