用另一个Python覆盖一张纸

问题描述 投票:0回答:1

我需要在两个Excel工作表中写入特定数据,第一工作表将由第一个日期和最后一个日期填充,而第二工作表将包含两个特定行之间的时间差(仅在df.iloc[i, 1] == '[1]->[0]' and df.iloc[i + 1, 1] == '[0]->[1]'时计算时间差) 。

这是我的代码:

import xlsxwriter
import pandas as pd

df= pd.DataFrame({'Time':['2019/01/03 15:02:07', '2019/01/03 15:16:55', '2019/01/03 15:17:20', '2019/01/03 15:28:58','2019/01/03 15:32:28','2019/01/03 15:38:54'],
 'Payload':['[0]->[1]', '[1]->[0]','[0]->[1]','[0]->[1]','[1]->[0]','[0]->[1]']})


workbook = xlsxwriter.Workbook('Results.xlsx') 
ws = workbook.add_worksheet("Rapport détaillé")
#    wsNavco = workbook.add_worksheet("Délai reconnexion NAVCO")
ws.set_column(0, 1, 30)
ws.set_column(1, 2, 25)
# Add a format. Light yellow fill with dark red text.
format1 = workbook.add_format({'bg_color': '#fffcad',
                               'font_color': '#0a0a0a'})
# Add a format. Green fill with dark green text.
format2 = workbook.add_format({'bg_color': '#e7fabe',
                               'font_color': '#0a0a0a'})
# Write a conditional format over a range.
ws.conditional_format('A1:A24', {'type': 'cell',
                                     'criteria': '>=',
                                     'value': 50,
                                     'format': format1})
ws.conditional_format('B1:B24', {'type': 'cell',
                                     'criteria': '>=',
                                     'value': 50,
                                     'format': format2})


parametres = ( 
        ['Parametres', 'Valeurs'],
        ['1ere date  ', str(df['Time'].iloc[0])],
        ['Derniere date  ', str(df['Time'].iloc[len(df)-1])],

) 
# Start from the first cell. Rows and 
# columns are zero indexed. 
row = 0
col = 0

# Iterate over the data and write it out row by row. 
for name, parametres in (parametres): 
    ws.write(row, col, name) 
    ws.write(row, col + 1, parametres) 
    row += 1

workbook.close()


df= df.sort_values(by='Time')
df.Time = pd.to_datetime(df.Time, format='%Y/%m/%d %H:%M:%S')
print('df\n',df)
diff = []
for i in range(len(df) - 1):
    if df.iloc[i, 1] == '[1]->[0]' and df.iloc[i + 1, 1] == '[0]->[1]':
        time_diff = df.iloc[i + 1, 0] - df.iloc[i, 0]
    else:
        time_diff = 0
    diff.append(time_diff)

diff.append(0) # to fill the last value
df['Difference'] = diff
print(df['Difference'])
print('df1\n',df)

workbook = xlsxwriter.Workbook('Results.xlsx') 
wsNavco = workbook.add_worksheet('Délai reconnexion NAVCO')
#    wsNavco = wb.worksheets[1]
wsNavco.set_column(0, 1, 25)
wsNavco.set_column(1, 2, 55)
# Add a format. Light yellow fill with dark red text.
format1 = workbook.add_format({'bg_color': '#fffcad',
                               'font_color': '#0a0a0a'})
# Add a format. Green fill with dark green text.
format2 = workbook.add_format({'bg_color': '#e7fabe',
                               'font_color': '#0a0a0a'})
# Write a conditional format over a range.
wsNavco.conditional_format('A1:A24', {'type': 'cell',
                                     'criteria': '>=',
                                     'value': 50,
                                     'format': format1})
wsNavco.conditional_format('B1:B24', {'type': 'cell',
                                     'criteria': '>=',
                                     'value': 50,
                                     'format': format2})


for i in range (len(df)-1):
    wsNavco.set_column(1, 1, 15)
    wsNavco.write('A'+str(3),'Payload')
    wsNavco.write('A'+str(i+4), str((df.iloc[i,1])))

    wsNavco.write('B'+str(3),'Délai reconnexion NAVCO')
    wsNavco.write('B'+str(i+4), str((df.iloc[i,2])))


workbook.close()

问题是它创建了第一张纸并命名并填充它,但是随后它[[覆盖第一张纸被第二张纸覆盖。

我的问题是:如何保存两张纸。
pandas overwrite xlsxwriter
1个回答
1
投票
您无法使用Xlsxwriter附加到现有工作簿,您需要在关闭工作簿之前执行所有写入操作。就您而言,这应该很好,只需删除关闭并重新打开“ Rapportdétaillé”和“Délaireconnexion NAVCO”之间的书的行]

如果您准备将数据预先放入DataFrames,它将变得非常简单。

import pandas as pd # Create some Pandas dataframes from some data. df1 = pd.DataFrame({'Data': [11, 12, 13, 14]}) df2 = pd.DataFrame({'Data': [21, 22, 23, 24]}) df3 = pd.DataFrame({'Data': [31, 32, 33, 34]}) # Create a Pandas Excel writer using XlsxWriter as the engine. writer = pd.ExcelWriter('pandas_multiple.xlsx', engine='xlsxwriter') # Write each dataframe to a different worksheet. df1.to_excel(writer, sheet_name='Sheet1') df2.to_excel(writer, sheet_name='Sheet2') df3.to_excel(writer, sheet_name='Sheet3') # Close the Pandas Excel writer and output the Excel file. writer.save()

[还有一些替代引擎,例如Openpyxl支持附加。有关详细信息,请参见this answer
© www.soinside.com 2019 - 2024. All rights reserved.