告别手动统计!用Python+WeChatMsg给你的微信聊天做个‘年度报告’(附完整代码)

📅 2026/7/13 9:22:04 👁️ 阅读次数 📝 编程学习
告别手动统计!用Python+WeChatMsg给你的微信聊天做个‘年度报告’(附完整代码)

用Python打造你的微信社交记忆博物馆:从数据挖掘到情感可视化

你是否好奇自己和好友的聊天中隐藏着哪些时间密码?那些深夜的倾诉、午后的闲谈,是否在数据中呈现出意想不到的规律?今天,我们将用Python和WeChatMsg工具,把你的微信聊天记录转化为一本充满惊喜的"社交年鉴"。

1. 环境准备与数据获取

1.1 工具链配置

开始前需要准备以下Python生态工具:

pip install pandas matplotlib seaborn jieba wordcloud july

关键组件说明

  • WeChatMsg:开源微信聊天记录导出工具
  • jieba:中文分词利器
  • july:日历热力图专用库
  • wordcloud:词云生成引擎

提示:建议使用Python 3.8+环境,某些库在3.10+版本可能存在兼容性问题

1.2 数据获取实战

通过WeChatMsg获取数据的流程优化版:

  1. 下载发布版本的可执行文件
  2. 登录PC端微信(确保聊天记录完整)
  3. 运行工具选择联系人导出CSV
  4. 检查生成文件结构:
data/ ├── chat_records/ │ ├── 张三.csv │ └── 李四.csv └── user_info.json

2. 数据清洗与结构化

2.1 原始数据预处理

典型的数据清洗代码示例:

def preprocess_data(raw_df): # 保留文本消息 filtered_df = raw_df[raw_df['Type'] == 1].copy() # 提取关键字段 result_df = filtered_df[['IsSender', 'StrContent', 'StrTime']] # 时间格式化 result_df['DateTime'] = pd.to_datetime(result_df['StrTime']) result_df['Date'] = result_df['DateTime'].dt.date result_df['Hour'] = result_df['DateTime'].dt.hour return result_df

常见问题处理方案:

问题类型解决方案代码示例
乱码消息编码转换df['StrContent'] = df['StrContent'].str.encode('latin1').str.decode('gbk')
空内容过滤处理df = df[df['StrContent'].notna()]
系统消息类型筛选df = df[df['Type'] == 1]

2.2 高级特征工程

扩展更多分析维度:

def add_time_features(df): df['Weekday'] = df['DateTime'].dt.day_name() df['Month'] = df['DateTime'].dt.month_name() df['YearMonth'] = df['DateTime'].dt.to_period('M') df['TimeSegment'] = pd.cut(df['Hour'], bins=[0,6,12,18,24], labels=['深夜','上午','下午','晚上']) return df

3. 多维社交画像分析

3.1 时间维度洞察

24小时活跃模式分析

def plot_hourly_pattern(hourly_df): plt.figure(figsize=(12,6)) sns.lineplot(data=hourly_df, x='Hour', y='Count', hue='Person', style='Person', markers=True, dashes=False) plt.title('24小时消息发送规律对比') plt.xticks(range(0,24)) plt.grid(True)

典型发现模式:

  • 晨型人:7-9点活跃高峰
  • 夜猫子:22-1点持续活跃
  • 工作型:10-12点 & 14-17点双高峰

3.2 词汇特征挖掘

个性化词云生成技巧

def create_persona_wordcloud(text, mask_img=None): wc = WordCloud( font_path='msyh.ttc', background_color='white', max_words=200, mask=mask_img, colormap='viridis', contour_width=3 ) word_freq = Counter(jieba.lcut(text)) return wc.generate_from_frequencies(word_freq)

技巧:使用自定义形状遮罩图片(mask参数)可以制作心形、头像轮廓等特色词云

4. 高级可视化呈现

4.1 日历热力图

使用july库制作专业级日历视图:

def create_calendar_heatmap(chat_df): dates = chat_df['Date'].unique() counts = chat_df['Date'].value_counts() plt.figure(figsize=(12,6)) july.heatmap(dates, counts, title='2023年消息日历', cmap='golden', month_grid=True)

4.2 关系互动图谱

构建对话响应网络:

def build_conversation_network(df): # 计算消息响应时间 df['ResponseTime'] = df['DateTime'].diff() # 构建节点和边 nodes = df['Sender'].unique() edges = df.groupby(['PrevSender','Sender']).size() # 使用networkx绘制 G = nx.DiGraph() G.add_nodes_from(nodes) for (source, target), weight in edges.items(): G.add_edge(source, target, weight=weight) return G

5. 自动化报告生成

5.1 使用Jinja2模板

创建HTML报告模板:

<!DOCTYPE html> <html> <head> <title>{{ title }}</title> <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> </head> <body> <h1>{{ partner_name }}的年度社交报告</h1> <div class="chart" id="calendarHeatmap"></div> <div class="chart" id="hourlyPattern"></div> <div class="wordcloud"> <h2>你的关键词云</h2> <img src="{{ wordcloud_me }}" width="45%"> <img src="{{ wordcloud_other }}" width="45%"> </div> </body> </html>

5.2 完整报告生成流程

def generate_full_report(chat_file, template_path): # 数据准备 raw_df = pd.read_csv(chat_file) processed_df = preprocess_data(raw_df) # 分析模块 time_analysis = analyze_time_patterns(processed_df) word_stats = analyze_word_frequency(processed_df) # 可视化生成 create_calendar_heatmap(processed_df).savefig('calendar.png') create_wordclouds(processed_df) # 报告渲染 template = Template(open(template_path).read()) html = template.render( title="2023社交报告", partner_name="张三", wordcloud_me="wc_me.png", wordcloud_other="wc_other.png" ) with open('report.html', 'w') as f: f.write(html)

6. 隐私保护与优化建议

6.1 数据安全方案

本地处理的最佳实践:

  1. 始终在离线环境处理原始数据
  2. 使用完成后立即删除敏感CSV文件
  3. 对生成的报告进行匿名化处理
def anonymize_data(df): df['Sender'] = df['IsSender'].map({1:'我', 0:'对方'}) df['Content'] = df['StrContent'].apply( lambda x: re.sub(r'\d{11}', '[PHONE]', x)) return df

6.2 性能优化技巧

处理百万级消息的优化方案:

优化方向实施方法效果提升
内存优化使用dtype指定列类型减少40%内存占用
速度优化禁用jieba并行模式避免多进程冲突
IO优化使用parquet格式存储读写速度提升5x
# 内存优化示例 dtype_spec = { 'IsSender': 'bool', 'StrContent': 'string', 'StrTime': 'string' } pd.read_csv('chat.csv', dtype=dtype_spec)

在完成第一个版本的报告后,我发现最有价值的往往不是那些冷冰冰的数据,而是通过时间线重现的那些重要时刻——比如在生日前后消息量的异常峰值,或是某个深夜长谈形成的词云特征。这些数字痕迹最终拼凑出的,是一幅用代码绘制的记忆地图。