我有一个棘手的问题,试图比较Excel文件中的工作表,其中我有很多。问题是这样的:
我有一个包含大约1000个.xlsx文件的目录,每个文件都有16个工作表,每个文件都是对某一天的数据的预测,使用的是连续4天的数据,如果还没有包含前一周的星期六的数据的话,再加上一个星期六的数据。
例如,如果我预测2022年12月17日,文件名将是xxx_1217.xlsx
,其中的前5个工作表将被称为['10-12','13-12','14-12','15-12','16-12']
。其中10日是星期六,因此为什么跳过11日和12日。
我们将此文件命名为1。
现在文件夹中的下一个文件将是第二天,2022年12月18日,包含4个相同的日子加上一个新的日子,这是我们试图预测的实际结果(不是我们预测的那一天),所以这个文件将被称为xxx_1218.xlsx
,包含以下5张['17-12','13-12','14-12','15-12','16-12']
。顺序无关紧要,17日是星期六。
让我们称这个文件为2。
现在问题来了。我想检查文件1中与文件2中具有相同日期的工作表是否包含完全相同的数据。然后遍历每个连续的文件并进行相同的比较。因此,在文件1的工作表与文件2进行比较之后,文件2的工作表应与文件3进行比较,依此类推。
到目前为止,我有以下内容,它做了很多体操从目录中获取文件,工作表的名称,然后从dict.keys中创建相关的列表,然后在dataframes中调用它们来比较它们。
import pandas as pd
import os
from datetime import date
path_root =r'C:\Users\Files'
filenames = [file for file in os.listdir(path_root) if file.endswith('.xlsx')]
keys_list = []
df1_keys_list = []
df2_keys_list = []
for i in range(len(filenames)):
filename = filenames[i]
filename_compare = filenames[i+1]
day = filename[-7:-5]
month = filename[-9:-7]
day_compare = filename_compare[-7:-5]
month_compare = filename_compare[-9:-7]
filename_compare = 'prealign_debug_'+month_compare+day_compare+'.xlsx'
Path_1 = os.path.join(path_root,filename)
Path_2 = os.path.join(path_root,filename_compare)
df1 = pd.read_excel(Path_1, sheet_name=None)
df2 = pd.read_excel(Path_2, sheet_name=None)
for j in df1.keys():
df1_keys_list.append(j)
df1_days = df1_keys_list[0:5]
for k in df2.keys():
df2_keys_list.append(k)
df2_days = df2_keys_list[0:5]
df3 = pd.read_excel(Path_1, sheet_name=df1_days[1])
df4 = pd.read_excel(Path_1, sheet_name=df1_days[2])
df5 = pd.read_excel(Path_1, sheet_name=df1_days[3])
df6 = pd.read_excel(Path_2, sheet_name=df1_days[0])
df7 = pd.read_excel(Path_2, sheet_name=df1_days[1])
df8 = pd.read_excel(Path_2, sheet_name=df1_days[2])
[print('correct') if df3.equals(df6) else print('incorrect')]
[print('correct') if df4.equals(df7) else print('incorrect')]
[print('correct') if df5.equals(df8) else print('incorrect')]
这是一个有点麻烦,可能有一个更圆滑的方式来做,但这是我无论如何。
出现两个问题,一个:我这里的循环结构有问题
for j in df1.keys():
df1_keys_list.append(j)
df1_days = df1_keys_list[0:5]
作为列表df1_keys_list
最终是95个元素长时,它应该是5.也许有一个更好的方法,使键列表引用工作表?
其次,我知道它不起作用,因为我正在比较5个完全相同的文件,当我更改其中一个文件中的条目时,当我运行脚本时,我仍然得到'correct'
打印语句,除了当我更改第二个文件中的条目时...
我该如何整理这件事,我做错了什么?
1条答案
按热度按时间fruv7luv1#
下面是你的代码的重构版本,其中我创建了一个compare_file函数,以便代码更加模块化,为了简单起见,我将键转换为列表并使用列表切片获取前5个元素,我在循环中添加了if语句,而不是列表解析。