【发布时间】:2018-02-21 14:32:15
【问题描述】:
我正在尝试创建一个 python 程序,它可以为我提供 2 个带有多个工作表的大型 excel 文件之间的差异。我得到它来将结果打印到 Excel,但显然当其中一个单元格包含日期时间数据时,将布尔数据框与包含日期的数据框相乘的操作不再起作用。我收到以下错误:
TypeError: *: 'bool' 和 'datetime.datetime' 的操作数类型不受支持
'EDIT':我刚刚意识到这个方法也不适用于字符串(它只适用于纯数字数据)。有什么更好的方法可以处理字符串、数字和时间数据?
#start of program
import pandas as pd
from pandas import ExcelWriter
import numpy as np
df1 = pd.read_excel('4_Input EfE_2030.xlsm',None)
df2 = pd.read_excel('5_Input EfE_2030.xlsm',None)
keys1=df1.keys()
keys2=df2.keys()
writer = ExcelWriter('test1.xlsx')
#loop for all sheets and create new dataframes with the differences
for x in keys1:
df3 = pd.read_excel('4_Input EfE_2030.xlsm',sheetname=x,header=None)
df4 = pd.read_excel('5_Input EfE_2030.xlsm',sheetname=x,header=None)
dif = df3 != df4
df=dif*df3
df2=dif*df4
nrcolumns=len(df.columns)
#when there are no differences in the entire sheet the dataframe will be empty. Add 1 to row indexes so the number coincides with excel rownumbers
if not df.empty:
# df.columns = ['A']
df.index = np.arange(1, len(df) + 1)
if not df2.empty:
# df2.columns = ['A']
df2.index = np.arange(1, len(df) + 1)
#delete rows with all 0
df = df.loc[~(df == 0).all(axis=1)]
df2 = df2.loc[~(df2 == 0).all(axis=1)]
#create new df with the data of the 2 sheets
result = pd.concat([df,df2],axis=1)
print(result)
result.to_excel(writer,sheet_name=x)
【问题讨论】:
-
我更新了我的答案以描述一种新方法,因为对您的原始问题进行了编辑(即,只有严格的数值适用于您的方法)。我希望它会有所帮助。它让你有一些地方,但不是全部。我只是没时间了! :)