在信息爆炸的时代,阅读是自我提升的重要途径。但如何量化阅读习惯、发现时间投入的规律?本文将介绍一个个人阅读统计分析工具,通过Python结合pandas和matplotlib,实现从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()),实现“统计+可视化”的一站式体验。
运行说明
- 准备数据:创建CSV文件(如示例的
reading_log.csv),确保列名:日期、书籍名称、阅读时长。 - 安装依赖:执行
pip install pandas matplotlib安装Python库。 - 运行代码:直接运行脚本,自动生成
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数据处理与可视化的核心技能,更能将“量化分析”思维迁移到生活/工作的多领域,真正实现技术赋能决策!