pandas 比较XLSX文件目录中的工作表

kgsdhlau  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个棘手的问题,试图比较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'打印语句,除了当我更改第二个文件中的条目时...
我该如何整理这件事,我做错了什么?

fruv7luv

fruv7luv1#

下面是你的代码的重构版本,其中我创建了一个compare_file函数,以便代码更加模块化,为了简单起见,我将键转换为列表并使用列表切片获取前5个元素,我在循环中添加了if语句,而不是列表解析。

import pandas as pd
import os

path_root = r'C:\Users\Files'
filenames = [file for file in os.listdir(path_root) if file.endswith('.xlsx')]

def compare_files(file1, file2):
    df1 = pd.read_excel(file1, sheet_name=None)
    df2 = pd.read_excel(file2, sheet_name=None)

    df1_days = list(df1.keys())[:5]
    df2_days = list(df2.keys())[:5]

    common_days = set(df1_days) & set(df2_days)

    for day in common_days:
        if df1[day].equals(df2[day]):
            print(f'{day} in {file1} and {file2} are correct')
        else:
            print(f'{day} in {file1} and {file2} are incorrect')

for i in range(len(filenames) - 1):
    filename1 = os.path.join(path_root, filenames[i])
    filename2 = os.path.join(path_root, filenames[i + 1])
    compare_files(filename1, filename2)

相关问题