阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用python把csv汇总成excel

89次阅读
没有评论

共计 3798 个字符,预计需要花费 10 分钟才能阅读完成。

导读 最近领导安排让我每周定时把 grafana 导出的 csv 文件进行统计汇总工作,需要处理的 csv 文件还是蛮多的,况且还要每周重复汇总处理。干脆写个脚本,每周执行一遍脚本,既方便还不会出错。
一、需求分析
1. 原始文件分析

原始文件是多个 csv 表格,第一列为时间戳,每 10 分钟统计生成一行,其余列为 ip 地址在该时间段内的访问次数

使用 python 把 csv 汇总成 excel

2. 处理结果分析

根据要求,统计每个 ip 地址在当天访问次数求和,汇总生成新表格,结果如下,并将所有 csv 文件按照文件名,分别汇总到不同的 sheet 下

使用 python 把 csv 汇总成 excel

二、代码逻辑
1. 流程分析
  • 首先遍历指定目录下的.csv 文件,提取文件名生成数组
  • 然后使用 pandas 库读取 csv 文件,提取日期和 ip,然后统计每个 ip 当天访问次数,生成新的 DataFrame
  • 最后使用 xlwings 库将 pandas 处理后的 DataFrame 数据写入 excel 文件,指定文件名作为 sheet 名
2. 遍历指定目录下.csv 文件

主要用到了 os 模块中的 walk() 函数,可以遍历文件夹下所有的文件名。

def find_csv(path):
        """
        查找目录下 csv 文件
        :param path: 查找 csv 的目录路径
        :return: csv 文件名 list
        """
        csv_file = []
        for root, dirs, files in os.walk(path):
            for file in files:
                if os.path.splitext(file)[1] == '.csv':
                    csv_file.append(os.path.join(root, file))
        return csv_file
3. pandas 处理 csv 文件

pandas 是 python 环境下最有名的数据统计包,对于数据挖掘和数据分析,以及数据清洗等工作,用 pandas 再合适不过了,官方地址:https://www.pypandas.cn/

def summary_data(file):
        """
        grafana 导出的 csv 文件处理汇总
        :param file: csv 文件路径
        :return: 处理完成后的 pandas 对象
        """
        # 读取整个 csv 文件
        csv_data = pd.read_csv(file, ';')
        # 提取日期
        csv_data["Time"] = csv_data["Time"].map(lambda Time: Time[0:10])
        date = csv_data["Time"].drop_duplicates()
        # 提取 IP
        ip_list = csv_data.columns.values[1:]
        # 生成新列表
        result_data = []
        for day in list(date):
            ip_data = []
            for ip in ip_list:
                # 统计指定 ip 地址在指定日期的数据之和
                ip_sum = csv_data.loc[csv_data['Time'] == day, ip].sum()
                ip_data.append(ip_sum)
                # print("日期:%s ip:%s 总计:%s" % (day, ip, ip_sum))
            result_data.append(ip_data)
        # 生成新的 DataFrame
        result_df = pd.DataFrame(result_data, index=list(date), columns=ip_list)
        # 添加行列统计
        result_df['day_sum'] = result_df.apply(lambda x: x.sum(), axis=1)
        result_df.loc['ip_sum'] = result_df.apply(lambda x: x.sum())
        print(file, "处理完毕!")
        return result_df
4. excel 数据写入

pandas 的 to_excel 方法也可以写入到 excel 文件,但是如果需要写入到指定的 sheet,就无法满足需求了,此时就需要用的 xlwings 或者 openpyxl 库,此处使用 xlwings,参考文档:https://www.xlwings.org/pro

def save_excel(data_df, file_name, excel_name):
        """
        生成并写入新 excel 文件
        :param data_df: pandas 数据对象
        :param file_name: 传入文件名,作为生成的 sheet 名称
        :param excel_name: 生成 excel 文件名
        :return: null
        """sheet_name = file_name[file_name.rfind('/', 1) + 1:file_name.rfind('.', 1)]
        wb = xlwings.Book(excel_name)
        sheet = wb.sheets.add(name=sheet_name)
        sheet.range("A1").value = data_df
        wb.save()
        wb.close()
        print(sheet_name, "Sheet 写入完毕!")
5. 完整代码
    import os
    import pandas as pd
    import xlwingsdef find_csv(path):
        """
        查找目录下 csv 文件
        :param path: 查找 csv 的目录路径
        :return: csv 文件名 list
        """
        csv_file = []
        for root, dirs, files in os.walk(path):
            for file in files:
                if os.path.splitext(file)[1] == '.csv':
                    csv_file.append(os.path.join(root, file))
        return csv_file    def summary_data(file):
        """
        grafana 导出的 csv 文件处理汇总
        :param file: csv 文件路径
        :return: 处理完成后的 pandas 对象
        """
        # 读取整个 csv 文件
        csv_data = pd.read_csv(file, ';')
        # 提取日期
        csv_data["Time"] = csv_data["Time"].map(lambda Time: Time[0:10])
        date = csv_data["Time"].drop_duplicates()
        # 提取 IP
        ip_list = csv_data.columns.values[1:]
        # 生成新列表
        result_data = []
        for day in list(date):
            ip_data = []
            for ip in ip_list:
                ip_sum = csv_data.loc[csv_data['Time'] == day, ip].sum()
                ip_data.append(ip_sum)
                # print("日期:%s ip:%s 总计:%s" % (day, ip, ip_sum))
            result_data.append(ip_data)
        result_df = pd.DataFrame(result_data, index=list(date), columns=ip_list)
        # 添加行列统计
        result_df['day_sum'] = result_df.apply(lambda x: x.sum(), axis=1)
        result_df.loc['ip_sum'] = result_df.apply(lambda x: x.sum())
        print(file, "处理完毕!")
        return result_dfdef save_excel(data_df, file_name, excel_name):
        """
        生成并写入新 excel 文件
        :param data_df: pandas 数据对象
        :param file_name: 传入文件名,作为生成的 sheet 名称
        :param excel_name: 生成 excel 文件名
        :return: null
        """sheet_name = file_name[file_name.rfind('/', 1) + 1:file_name.rfind('.', 1)]
        wb = xlwings.Book(excel_name)
        sheet = wb.sheets.add(name=sheet_name)
        sheet.range("A1").value = data_df
        wb.save()
        wb.close()
        print(sheet_name, "Sheet 写入完毕!")    if __name__ == '__main__':
        # 原始 csv 文件存放路径
        path = './csv'
        # 生成 excel 文件名
        excel_name = 'cm.xlsx'
        csv_file = find_csv(path)
        # 创建 excel 文件
        new_excel = pd.DataFrame()
        new_excel.to_excel(excel_name)
        # 处理并写入 excel 文件
        for file in csv_file:
            data_df = summary_data(file)
            save_excel(data_df, file, excel_name)
        # 删除默认 Sheet1
        wb = xlwings.Book(excel_name)
        wb.sheets['Sheet1'].delete()
        wb.save()
        wb.close()
        print("数据汇总完毕, 生成文件路径 %s/%s" % (os.getcwd(), excel_name))

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计3798字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中