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

使用python把csv汇总成excel

324次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7805592
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
升级自动部署更新SSL证书系统、申请godaddy的APIKEY

升级自动部署更新SSL证书系统、申请godaddy的APIKEY

升级自动部署更新 SSL 证书系统、申请 godaddy 的 APIKEY 公司之前花钱购买的 ssl 证书快...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...