Python日期列表按月分组可视化:是否需转DataFrame?求实现指引
按月统计日期数量并绘图的实现方法
是否需要转换为DataFrame?
不是必须,但借助pandas的DataFrame能大幅简化统计逻辑,且和绘图工具(如matplotlib)的兼容性更好,是更高效的选择。
方法一:不使用DataFrame(纯标准库+matplotlib)
用字典手动统计每月数据量,再绘图:
from datetime import datetime import matplotlib.pyplot as plt # 原始日期列表 my_original_list = ['December 1, 2003', 'February 22, 2004', 'February 29, 2004', 'March 8, 2004', 'December 25, 2003'] # 批量转换为datetime.date对象 new_list = [datetime.strptime(date_str, '%B %d, %Y').date() for date_str in my_original_list] # 按月统计:用"年-月"作为唯一标识 month_counts = {} for date in new_list: month_key = f"{date.year}-{date.month:02d}" # 统一格式为YYYY-MM month_counts[month_key] = month_counts.get(month_key, 0) + 1 # 排序并准备绘图数据 sorted_months = sorted(month_counts.keys()) counts = [month_counts[month] for month in sorted_months] # 绘制柱状图 plt.bar(sorted_months, counts) plt.xlabel('月份') plt.ylabel('日期数量') plt.title('每月日期数量统计') plt.xticks(rotation=45) # 旋转标签避免重叠 plt.tight_layout() plt.show()
方法二:使用DataFrame(推荐)
利用pandas的分组功能快速统计,代码更简洁:
from datetime import datetime import pandas as pd import matplotlib.pyplot as plt # 原始日期列表 my_original_list = ['December 1, 2003', 'February 22, 2004', 'February 29, 2004', 'March 8, 2004', 'December 25, 2003'] # 转换为DataFrame new_list = [datetime.strptime(date_str, '%B %d, %Y').date() for date_str in my_original_list] df = pd.DataFrame({'date': new_list}) # 提取年-月并分组统计 df['year_month'] = df['date'].dt.strftime('%Y-%m') month_stats = df.groupby('year_month').size().reset_index(name='count') # 直接绘图 month_stats.plot(kind='bar', x='year_month', y='count', legend=False) plt.xlabel('月份') plt.ylabel('日期数量') plt.title('每月日期数量统计') plt.xticks(rotation=45) plt.tight_layout() plt.show()
补充说明
- 如果不需要区分年份,可将分组键改为月份名称(
date.strftime('%B'))或月份数字(date.month); - 处理大量数据时,DataFrame方法的统计效率远高于手动遍历字典。
内容的提问来源于stack exchange,提问作者Raven_28
相关产品推荐
相关产品推荐

