我有一个巨大的csv文件,其中包含价值一年的股票日内数据,因为它太大而无法分析,所以我想事先处理这些数据。
我想将其分解为12个excel文件(12个月),每个文件都有28-31个工作表/标签/页面,其中包含该日期的当日数据。因此,我准备了这些名为Stock-01,Stock-02到Stock-12的excel文件,此刻它们为空,等待数据由我的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
我的方法是,索引包含所有日期,因此使用索引运行整个过程,我选择了准备好的excel文件,使用日期(索引)附加了具有名称的工作表,并使用简单的to_excel函数直接复制了数据框。
但是,结果是,它只有一张纸,并且该纸具有最后的日期数据。 (一个可能的原因可能是该程序每次都在创建一个新的工作簿,而不是阅读现有的工作簿)
询问类似的question,但这正在另一种方法上。我想直接向excel写一个数据框,但是在这个问题上,使用xlsxwriter,我似乎无法做到,因为它仅接受str值。
答案 0 :(得分:1)
之所以只有一个选项卡,是因为通过每次迭代,您将创建一个名为“ 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()
答案 1 :(得分:0)
您可以做的是在for循环之前创建空白的excel文件。一旦那是excel书,您就可以使用
加载它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
在同一文件中写入新的工作表。我希望这回答了你的问题。