# 个人阅读统计分析工具:用Python实现数据统计与可视化


在信息爆炸的时代,阅读是自我提升的重要途径。但如何量化阅读习惯、发现时间投入的规律?本文将介绍一个个人阅读统计分析工具,通过Python结合pandasmatplotlib,实现从CSV阅读记录到多维度统计、可视化的全流程。该工具帮助用户快速分析“哪段时间阅读量高”“哪本书投入最多”,并通过图表直观呈现,辅助优化阅读计划。适合Python中级以下开发者,练习数据处理+可视化能力,掌握文件操作、分组统计、图表绘制等核心技能。

思路分析:从CSV到统计可视化的全流程

要实现这个工具,需拆解为数据读取、多维度统计、可视化呈现、结果导出四个核心步骤:

1. 数据读取

使用pandas读取CSV文件,确保数据包含“日期”“书籍名称”“阅读时长”三个关键字段,处理可能的空值或格式错误。

2. 多维度统计

  • 时间维度(每日):按“日期”分组,求和阅读时长,量化每日阅读量。
  • 书籍维度:按“书籍名称”分组,求和后计算占比(单本书时长/总时长),识别时间投入的重心。
  • 极值识别:从书籍统计中找到时长最大的“最常阅读书籍”,明确阅读优先级。

3. 可视化呈现

  • 柱状图:以“月-日”为x轴,阅读时长为y轴,展示每日阅读量波动。
  • 饼图:以扇形面积体现书籍阅读时长占比,直观呈现阅读重心。

4. 结果导出

将统计结果格式化写入txt文件,便于留存和分享。

代码实现:分步骤讲解核心逻辑

以下是完整的Python代码,包含详细注释:

import pandas as pd
import matplotlib.pyplot as plt

def analyze_reading_log(csv_path, output_txt, show_plots=True):
    """
    分析阅读记录CSV文件,生成统计结果、可视化图表并导出文本
    :param csv_path: CSV文件路径(需包含:日期、书籍名称、阅读时长)
    :param output_txt: 统计结果输出的txt文件路径
    :param show_plots: 是否自动显示可视化图表
    """
    # ========== 步骤1:读取CSV数据,检查字段完整性 ==========
    try:
        df = pd.read_csv(csv_path)
        # 检查必需字段是否存在
        required_cols = ['日期', '书籍名称', '阅读时长']
        if not all(col in df.columns for col in required_cols):
            raise ValueError(f"CSV文件需包含字段:{required_cols}")
    except FileNotFoundError:
        print(f"错误:文件 {csv_path} 不存在!请检查路径。")
        return
    except Exception as e:
        print(f"数据读取失败:{e}")
        return

    # ========== 步骤2:多维度统计分析 ==========
    # 2.1 每日阅读时长统计(时间维度)
    daily_stats = df.groupby('日期')['阅读时长'].sum().reset_index()
    # 简化日期格式(提取“月-日”,如2023-10-01→10-01)
    daily_stats['日期_简化'] = daily_stats['日期'].apply(lambda x: x.split('-')[1] + '-' + x.split('-')[2])

    # 2.2 书籍阅读时长统计(书籍维度)
    book_stats = df.groupby('书籍名称')['阅读时长'].sum().reset_index()
    total_duration = book_stats['阅读时长'].sum()  # 所有书籍的总阅读时长
    # 计算每本书的阅读时长占比(保留2位小数)
    book_stats['占比(%)'] = (book_stats['阅读时长'] / total_duration * 100).round(2)

    # 2.3 识别最常阅读书籍(时长最大的书籍)
    most_read = book_stats[book_stats['阅读时长'] == book_stats['阅读时长'].max()]
    most_read_name = most_read.iloc[0]['书籍名称']
    most_read_duration = most_read.iloc[0]['阅读时长']

    # ========== 步骤3:可视化图表生成 ==========
    # 3.1 每日阅读时长趋势(柱状图)
    plt.figure(figsize=(10, 6))
    plt.bar(
        daily_stats['日期_简化'], 
        daily_stats['阅读时长'], 
        color='#1f77b4',  # 蓝色系,增强可读性
        edgecolor='black', 
        zorder=3  # 确保柱子在网格线上方
    )
    plt.xlabel('日期(月-日)', fontsize=12)
    plt.ylabel('阅读时长(分钟)', fontsize=12)
    plt.title('每日阅读时长趋势', fontsize=14, fontweight='bold')
    plt.xticks(rotation=45, ha='right')  # 旋转x轴标签,避免重叠
    plt.grid(axis='y', linestyle='--', alpha=0.7, zorder=0)  # 添加水平网格线,增强可读性
    plt.tight_layout()  # 自动调整布局,防止标签截断

    # 3.2 书籍阅读时长占比(饼图)
    plt.figure(figsize=(8, 8))
    labels = book_stats['书籍名称']
    sizes = book_stats['占比(%)']
    colors = ['#ff9999', '#66b3ff', '#99ff99']  # 柔和颜色方案,避免视觉疲劳
    plt.pie(
        sizes, 
        labels=labels, 
        colors=colors, 
        autopct='%1.2f%%',  # 显示百分比(保留2位小数)
        startangle=90, 
        textprops={'fontsize': 12}
    )
    plt.axis('equal')  # 保证饼图为正圆形
    plt.title('各书籍阅读时长占比分布', fontsize=14, fontweight='bold')

    # ========== 步骤4:统计结果导出(文本文件) ==========
    with open(output_txt, 'w', encoding='utf-8') as f:
        # 写入每日阅读统计
        f.write("==== 每日阅读时长统计 ====\n")
        for _, row in daily_stats.iterrows():
            f.write(f"{row['日期']}: {row['阅读时长']}分钟\n")
        f.write("\n")

        # 写入书籍阅读统计
        f.write("==== 书籍阅读时长统计 ====\n")
        for _, row in book_stats.iterrows():
            f.write(f"{row['书籍名称']}: {row['阅读时长']}分钟(占比 {row['占比(%)']}%)\n")
        f.write("\n")

        # 写入最常阅读书籍
        f.write(f"最常阅读书籍:{most_read_name}(总时长{most_read_duration}分钟)\n")

    # 显示图表(若设置为True)
    if show_plots:
        plt.show()  # 依次显示柱状图和饼图

    print(f"统计结果已导出至 {output_txt},图表已生成!")


# ========== 主函数调用(示例:读取reading_log.csv,输出reading_stats.txt) ==========
if __name__ == "__main__":
    csv_path = 'reading_log.csv'  # 输入CSV文件路径
    output_txt = 'reading_stats.txt'  # 输出统计文件路径
    analyze_reading_log(csv_path, output_txt)

代码核心逻辑解释

1. 数据读取与校验

  • 使用pd.read_csv读取CSV,通过all(col in df.columns)检查字段完整性,避免后续统计出错。
  • 若文件不存在或格式错误,通过try-except捕获异常,保证程序健壮性。

2. 分组统计与占比计算

  • 时间维度groupby('日期')['阅读时长'].sum()实现按日期聚合,简化日期格式(如2023-10-01→10-01)便于可视化。
  • 书籍维度groupby('书籍名称')聚合后,通过单本书时长 / 总时长 * 100计算占比,精准量化阅读重心。
  • 极值识别:通过max()找到书籍统计中时长最大的“最常阅读书籍”,明确时间投入的优先级。

3. 可视化优化技巧

  • 柱状图:添加水平网格线(grid(axis='y'))、旋转x轴标签(rotation=45),增强可读性;使用蓝色系(#1f77b4)提升视觉舒适度。
  • 饼图:采用柔和颜色(#ff9999等)、百分比标签(autopct='%1.2f%%'),保证图表清晰直观;axis('equal')确保饼图为正圆。

4. 结果导出与格式化

  • 通过with open写入txt文件,格式化字符串保证输出与示例一致(如“占比 43.75%”)。
  • 自动弹出图表(plt.show()),实现“统计+可视化”的一站式体验。

运行说明

  1. 准备数据:创建CSV文件(如示例的reading_log.csv),确保列名:日期书籍名称阅读时长
  2. 安装依赖:执行pip install pandas matplotlib安装Python库。
  3. 运行代码:直接运行脚本,自动生成reading_stats.txt并弹出两张图表(柱状图+饼图)。

总结与扩展

本工具通过Python实现了“数据读取→多维度统计→可视化→结果导出”的完整流程,核心学习点包括:
数据处理pandas分组统计、占比计算,掌握“按维度聚合”的思维,可迁移至消费记录、运动数据等场景。
可视化matplotlib图表美化(网格线、颜色、标签旋转),提升图表可读性与专业性。
工程实践:文件操作的异常处理、函数封装,让代码更健壮、易维护。

扩展方向

  • 月统计:提取日期的“年月”字段(如x.split('-')[0] + '-' + x.split('-')[1]),实现每月总时长统计
  • 交互优化:通过命令行参数(argparse)指定CSV路径,或添加GUI(如tkinter)选择文件。
  • 多格式导出:支持Excel(to_excel)、PDF(matplotlib.backends.backend_pdf)等格式,扩展应用场景。

通过这个项目,开发者不仅掌握了Python数据处理与可视化的核心技能,更能将“量化分析”思维迁移到生活/工作的多领域,真正实现技术赋能决策