如何基于datetime64类型日期绘制每日上传量直方图?
解决方案:构建每日上传数量直方图
核心思路
无需将日期转为非datetime类型,利用Pandas的时间序列工具按天统计上传量,再通过可视化工具生成直观的统计图表。
完整实现代码
import pandas as pd import matplotlib.pyplot as plt # 读取并预处理数据:读取时直接解析日期列,避免重复转换 df = pd.read_csv( 'query_result_2022-08-04T20_11_46.398221Z.csv', usecols=[9, 10], parse_dates=['Uploaded Date Time'] ) df.rename( {'Uploaded Date Time': 'uploadDate', 'Club Name': 'clubName'}, axis=1, inplace=True ) # 筛选目标俱乐部数据(注意:示例输出中俱乐部名称为`DM368-20220521`,需与实际数据匹配) cruiseDates = df[df['clubName'] == 'DM368-20220521'] # 按天统计上传数量(推荐用resample,保留datetime索引,自动补全无数据的日期) daily_uploads = cruiseDates.set_index('uploadDate').resample('D').size() # 绘制可视化图表 plt.figure(figsize=(10, 6)) daily_uploads.plot(kind='bar') plt.title('每日上传数量统计') plt.xlabel('日期') plt.ylabel('上传次数') plt.xticks(rotation=45) # 旋转日期标签避免重叠 plt.tight_layout() # 自动调整布局 plt.show()
关键细节说明
- 日期解析优化:读取CSV时通过
parse_dates参数直接将日期列解析为datetime类型,省去后续手动转换步骤。 - 按天统计的两种方式:
- resample方法:将日期设为索引后,
resample('D')按自然日分组,自动为无上传记录的日期填充0,保证时间序列连续性。 - groupby方法:若不需要补全空日期,可使用
cruiseDates.groupby(cruiseDates['uploadDate'].dt.date).size(),但结果索引为Python的date对象,绘图时日期格式处理稍繁琐。
- resample方法:将日期设为索引后,
- 可视化选择:柱状图(bar)比直方图(hist)更适合展示每日精确计数;若坚持用直方图,可将日期转换为ordinal数值后绘制:
dates = cruiseDates['uploadDate'].dt.floor('D') plt.hist(dates, bins=daily_uploads.index) plt.gcf().autofmt_xdate() # 自动旋转日期标签 plt.show()
问题修正提示
你代码中query的俱乐部名称是DM1368-20220521,但示例输出中实际为DM368-20220521,需确保筛选条件与数据中的俱乐部名称完全匹配,否则会得到空结果。
内容的提问来源于stack exchange,提问作者Steven Diffey
相关产品推荐
相关产品推荐

