如何用Python分析销售数据统计销售高峰时段与最活跃星期
实现方案
1. 时间字段预处理
先一次性提取需要的小时、星期维度字段,避免后续重复处理:
import pandas as pd import matplotlib.pyplot as plt # 转换交易时间为标准时间格式 Order_Details['Time'] = pd.to_datetime(Order_Details['Transaction Date']) # 提取小时字段(0-23对应全天24小时) Order_Details['Hour'] = Order_Details['Time'].dt.hour # 提取星期字段,映射为中文星期名 weekday_map = {0:'周一', 1:'周二', 2:'周三', 3:'周四', 4:'周五', 5:'周六', 6:'周日'} Order_Details['Weekday'] = Order_Details['Time'].dt.weekday.map(weekday_map)
2. 按小时升序统计交易频次
value_counts()默认按频次降序返回结果,只要对结果按索引排序,同时补全0-23点全时段(避免无交易时段缺失导致X轴断档),就能得到符合要求的序列,再拆分出两个独立列表即可:
# 统计各小时交易数,按0-23点顺序排列,无交易的小时频次填0 hour_counts = Order_Details['Hour'].value_counts().reindex(range(24), fill_value=0) # 拆分得到小时列表、对应交易频次列表 hour_list = hour_counts.index.tolist() hour_freq_list = hour_counts.values.tolist()
如果需要定位最活跃的小时,直接取hour_counts.idxmax()就能得到对应小时值,hour_counts.max()得到对应最高交易频次。
3. 按星期自然顺序统计交易频次
星期统计需要固定周一到周日的顺序,避免按字符排序打乱自然周周期:
# 定义周一到周日的固定顺序 weekday_order = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] # 统计各星期交易数,按自然周顺序排列 weekday_counts = Order_Details['Weekday'].value_counts().reindex(weekday_order, fill_value=0) # 拆分得到星期列表、对应交易频次列表 weekday_list = weekday_counts.index.tolist() weekday_freq_list = weekday_counts.values.tolist()
同理,weekday_counts.idxmax()可以直接得到一周内交易最活跃的星期。
4. 可视化实现
用柱状图展示离散时段的交易频次最直观,示例代码如下:
# 绘制小时维度交易频次图 plt.figure(figsize=(12, 5)) plt.bar(hour_list, hour_freq_list, color='#2E86AB') plt.title('全天各小时交易频次分布') plt.xlabel('小时(24小时制)') plt.ylabel('交易笔数') plt.xticks(range(24)) plt.grid(axis='y', alpha=0.3) plt.show() # 绘制星期维度交易频次图 plt.figure(figsize=(10, 5)) plt.bar(weekday_list, weekday_freq_list, color='#A23B72') plt.title('一周各天交易频次分布') plt.xlabel('星期') plt.ylabel('交易笔数') plt.grid(axis='y', alpha=0.3) plt.show()
可选:小时分段统计
如果需要按时间段(而非单小时)统计,可以用分箱实现:
# 自定义时段区间和标签 bins = [0, 6, 10, 14, 18, 22, 24] period_labels = ['凌晨0-6点', '早间6-10点', '上午10-14点', '下午14-18点', '晚间18-22点', '夜间22-24点'] Order_Details['Time_Segment'] = pd.cut(Order_Details['Hour'], bins=bins, labels=period_labels, right=False) # 按自定义时段顺序统计 segment_counts = Order_Details['Time_Segment'].value_counts().reindex(period_labels, fill_value=0)
内容的提问来源于stack exchange,提问作者Priyanshu Mohanty
相关产品推荐
相关产品推荐

