如何用Pandas绘制日期直方图?现有方法生成的是柱状图
嘿,这个问题我之前折腾过好几次!其实不用非得把年份转成数值数组,pandas和matplotlib本身就有处理日期直方图的简便路子,咱们来唠唠几种实用方法:
方法1:用pandas重采样+柱状图模拟日期直方图(最贴合需求)
日期直方图的核心就是按时间区间统计频次,咱们可以先对日期列按想要的时间粒度(年、月、日等)重采样,统计每个区间的数量,再画柱状图——这其实就是标准的日期直方图了:
import pandas as pd import matplotlib.pyplot as plt # 先确保日期列是datetime类型(这步很重要!) df['date_col'] = pd.to_datetime(df['date_col']) # 按年重采样,统计每年的记录数 yearly_counts = df['date_col'].resample('Y').count() # 绘制图表,这就是按年的日期直方图 yearly_counts.plot(kind='bar') plt.xlabel('年份') plt.ylabel('记录数量') plt.title('日期分布直方图(按年统计)') plt.show()
这里的'Y'可以换成其他时间频率:比如'M'是按月统计,'D'是按天,'Q'是按季度,完全根据你的需求调整就行。
方法2:直接用matplotlib绘制日期直方图
matplotlib其实支持直接对datetime类型的数据绘制直方图,你只需要指定时间区间作为bins就好:
import matplotlib.pyplot as plt import pandas as pd df['date_col'] = pd.to_datetime(df['date_col']) # 生成时间区间作为直方图的bins,比如按10年分一个区间 bins = pd.date_range(start=df['date_col'].min(), end=df['date_col'].max(), freq='10Y') plt.hist(df['date_col'], bins=bins) plt.xlabel('日期') plt.ylabel('记录数量') plt.title('日期分布直方图') plt.xticks(rotation=45) # 旋转日期标签,避免重叠 plt.show()
这样画出来的就是真正意义上的直方图,matplotlib会自动处理日期刻度的显示和区间内的频次统计。
方法3:提取时间成分绘制数值直方图(最直观的兜底方案)
如果上面两种方法都不符合你的预期,也可以直接提取年份(或月份、季度)转成数值,再画普通直方图:
import pandas as pd import matplotlib.pyplot as plt df['date_col'] = pd.to_datetime(df['date_col']) # 提取年份列 df['year'] = df['date_col'].dt.year # 绘制年份的直方图,bins可以指定数量或自定义区间 plt.hist(df['year'], bins=10) plt.xlabel('年份') plt.ylabel('记录数量') plt.title('年份分布直方图') plt.show()
总结一下:
- 要是想要严格按时间区间的直方图,方法1和2都很简便,不需要手动转换数值;
- 要是只关注单一时间维度(比如年份)的分布,方法3最直接好理解。
内容的提问来源于stack exchange,提问作者Agustin
相关产品推荐
相关产品推荐

