背景介绍
在数字化阅读日益普及的今天,很多读者会记录自己的阅读历程(如书籍名称、阅读时间、评分等)。如何从这些零散的阅读记录中提取有价值的信息(如每月阅读量、平均评分趋势)?本文将介绍一个“个人阅读统计分析工具”的实现,它能读取CSV格式的阅读记录,自动统计每月阅读数据并生成可视化图表,帮助你直观了解阅读习惯。
该工具不仅能锻炼数据处理(文件读写、日期解析、分组统计)和可视化(matplotlib绘图)能力,还能让阅读记录“活”起来——从冰冷的数字变成直观的图表,实用且有趣。
思路分析
要实现这个工具,我们需要分步骤解决以下问题:
- 数据读取与预处理:读取CSV文件,解析“阅读结束日期”为日期格式(便于按月份分组)。
- 按月统计:提取“阅读结束日期”的年月信息,按年月分组,统计每月阅读书籍数量(计数)和平均评分(均值)。
- 结果输出:将统计结果打印到命令行。
- 可视化呈现:使用
matplotlib绘制柱状图(展示每月阅读量)和折线图(展示平均评分趋势),并保存为图片。
代码实现
下面是完整的Python实现(依赖pandas和matplotlib,需提前安装:pip install pandas matplotlib):
import pandas as pd
import matplotlib.pyplot as plt
def analyze_reading_records(csv_path):
# 1. 读取CSV文件,处理日期格式
# 假设CSV文件第一行为表头,列名:书籍名称、阅读开始日期、阅读结束日期、评分
df = pd.read_csv(csv_path)
# 将“阅读结束日期”转换为datetime类型,便于后续按月份分组
df['阅读结束日期'] = pd.to_datetime(df['阅读结束日期'])
# 2. 提取年月信息(格式:YYYY-MM),作为分组依据
df['年月'] = df['阅读结束日期'].dt.strftime('%Y-%m') # 生成“2023-01”这样的字符串
# 3. 按“年月”分组,统计每月书籍数量(count)和平均评分(mean)
# 分组后,对“书籍名称”计数(统计数量),对“评分”求均值(平均评分)
monthly_stats = df.groupby('年月').agg(
书籍数量=('书籍名称', 'count'),
平均评分=('评分', 'mean')
).reset_index() # 重置索引,方便后续遍历
# 4. 输出统计结果到命令行
print("===== 阅读统计结果 =====")
for _, row in monthly_stats.iterrows():
month = row['年月']
count = row['书籍数量']
avg_rating = row['平均评分']
# 平均评分保留1位小数(如示例中的8.5、9.0)
print(f"{month}:阅读书籍{count}本,平均评分{avg_rating:.1f}")
# 5. 可视化:柱状图(每月阅读量)+ 折线图(平均评分)
# ---- 柱状图:每月阅读书籍数量 ----
plt.figure(figsize=(10, 6)) # 设置画布大小
x = monthly_stats['年月']
y_count = monthly_stats['书籍数量']
plt.bar(x, y_count, color='skyblue', width=0.6)
plt.title('每月阅读书籍数量统计')
plt.xlabel('月份')
plt.ylabel('书籍数量')
plt.xticks(rotation=45) # 旋转x轴标签,避免重叠
plt.tight_layout() # 自动调整布局,防止标签被截断
plt.savefig('books_count.png', dpi=300) # 保存为PNG,300dpi保证清晰度
# ---- 折线图:每月平均评分 ----
plt.figure(figsize=(10, 6))
y_avg = monthly_stats['平均评分']
plt.plot(x, y_avg, marker='o', color='orange', linestyle='-')
plt.title('每月阅读书籍平均评分')
plt.xlabel('月份')
plt.ylabel('平均评分')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('avg_rating.png', dpi=300)
if __name__ == "__main__":
# 示例CSV文件路径(请替换为你的文件路径)
csv_path = "reading_records.csv"
try:
analyze_reading_records(csv_path)
print("统计完成!柱状图已保存为books_count.png,折线图已保存为avg_rating.png")
except Exception as e:
print(f"出错啦:{e}")
代码解释
- 数据读取:
pd.read_csv()读取CSV文件,pd.to_datetime()将“阅读结束日期”转换为日期类型(支持后续的日期操作)。 - 年月提取:
dt.strftime('%Y-%m')将日期格式化为“YYYY-MM”的字符串(如2023-01),作为分组的唯一标识。 - 分组统计:
groupby('年月').agg(...)按年月分组,count统计书籍数量,mean计算平均评分。 - 可视化细节:
figsize=(10, 6)设置画布大小,避免图表拥挤。plt.xticks(rotation=45)旋转x轴标签,防止月份文字重叠。plt.tight_layout()自动调整子图间距,保证图表美观。savefig()将图表保存为PNG文件,dpi=300提升清晰度。
测试与验证
将示例CSV数据(如下)保存为reading_records.csv,运行代码:
书名,阅读开始日期,阅读结束日期,评分
《白夜行》,2023-01-01,2023-01-10,9
《解忧杂货店》,2023-01-15,2023-01-25,8
《活着》,2023-02-05,2023-02-12,9
《许三观卖血记》,2023-03-01,2023-03-10,8
《兄弟》,2023-03-15,2023-03-20,9
命令行输出将与示例一致:
===== 阅读统计结果 =====
2023-01:阅读书籍2本,平均评分8.5
2023-02:阅读书籍1本,平均评分9.0
2023-03:阅读书籍2本,平均评分8.5
统计完成!柱状图已保存为books_count.png,折线图已保存为avg_rating.png
可视化结果:
– books_count.png:横轴为2023-01、2023-02、2023-03,纵轴为书籍数量2、1、2(柱状图)。
– avg_rating.png:横轴同上,纵轴为平均评分8.5、9.0、8.5(折线图,带圆点标记)。
总结
通过这个项目,我们完成了从CSV数据读取→日期处理→分组统计→可视化输出的完整流程,核心收获包括:
- 数据处理能力:掌握
pandas的日期解析、分组统计(groupby+agg),能高效处理时间序列数据。 - 可视化技巧:学会用
matplotlib绘制柱状图、折线图,掌握图表美化(布局、标签旋转、清晰度设置)。 - 工程化思维:将“阅读统计”的生活场景转化为代码逻辑,通过异常捕获(
try-except)保证程序健壮性。
该工具可扩展空间大:比如支持多文件合并、按“阅读开始日期”统计、添加阅读时长分析(若CSV包含时长字段)等。如果你也有阅读记录,不妨用它分析自己的阅读轨迹,看看能否发现隐藏的阅读习惯~