Почему Pandas не создает новый лист в Excel? - PullRequest
1 голос
/ 08 марта 2019

У меня есть один гигантский CSV-файл, который содержит внутридневные данные о запасах за год, поскольку он слишком велик для анализа, я хотел бы обработать данные заранее.

Я хочу разбить его на 12 файлов Excel (12 месяцев), в каждом из которых будет 28-31 лист / вкладка / страница, содержащая эти внутридневные данные на эту дату. Поэтому я подготовил эти файлы Excel с именами Stock-01, Stock-02 до Stock-12, в данный момент они пусты, ожидая добавления данных моим кодом Python.

Я использую код ниже после того, как я использую read_csv:

for index in indexs:
    name = "Stock_" + index.strftime("%y-%m-%d")

    work = data[data.index.date == index].copy()
    columnsTitles = ['Volume','Open','High','Low','Close']
    work = work.reindex(columns= columnsTitles)

    filepath = "Stock-{}.xlsx".format(index.strftime("%m"))
    writer = ExcelWriter(filepath, engine='openpyxl')
    work.to_excel(writer, index = True, sheet_name=name)
    writer.save()
    writer.close()

    del work

Мой подход заключается в том, что indexs содержит все даты, следовательно, проходит через индекс, я выбираю подготовленный файл Excel, добавляю лист с именем, используя дату (index), и копирую информационный кадр напрямую, используя простую функцию to_excel.

Однако в результате получается только один лист, и этот лист содержит данные о последней дате. (Одной из возможных причин может быть то, что программа создает новую рабочую книгу каждый раз, а не читает существующую рабочую книгу)

Подобный вопрос задается, но это работает на другом подходе. Я хотел бы написать фрейм данных напрямую, чтобы преуспеть, но в этом вопросе, используя xlsxwriter, мне кажется, что я не могу это сделать, поскольку он принимает только значение str.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Причина, по которой у вас есть только одна вкладка, заключается в том, что на каждой итерации вы создаете новый файл с именем "Stock - {}. Xlsx" с одной вкладкой в ​​нем.В зависимости от вашего кода у вас будет несколько листов Excel или один лист, который будет перезаписан несколько раз.

Отредактировано после нашего обсуждения:

df = pd.read_csv("D:/AmiBackupeSignal/AMGN.txt", index_col="Date/Time")

df.index = pd.to_datetime(df.index)

# get list of all unique days/months 
days = df.index.day.unique().sort_values()
months = df.index.month.unique().sort_values()

for month in months:
    filepath = "Stock-{}.xlsx".format(month)
    with pd.ExcelWriter(filepath) as writer:
        for day in days:
            name = "Stock_" + "-".join([str(df.index.year.unique()[0]), str(month), str(day)])

            # get data for that month/day
            # this will create 31 tab
            temp = df.loc[(df.index.month == month) & (df.index.day == day)]
            temp.to_excel(writer, index = True, sheet_name=name)

        writer.save()
0 голосов
/ 08 марта 2019

Что вы можете сделать, это создать пустой файл Excel перед циклом for.Как только эта книга станет доступной, вы можете загрузить ее, используя

from openpyxl import load_workbook

book = load_workbook('CHANGE_THE_NAME.xlsx')

Затем для каждого объекта-писателя в цикле присоедините к нему эту книгу следующим образом:

writer = pandas.ExcelWriter('CHANGE_THE_NAME.xlsx', engine='openpyxl') 
writer.book = book

После этого вы можете использоватьto_excel для записи новых листов в тот же файл.Надеюсь, это ответит на ваш вопрос.

...