【问题标题】:Unable to align bins in a histogram of datetime objects using the hist() function无法使用 hist() 函数对齐日期时间对象直方图中的 bin
【发布时间】:2017-10-12 17:52:16
【问题描述】:

所以我试图绘制一些日期时间对象的直方图,但我永远无法让垃圾箱与条形对齐。我的代码如下:

我首先导入我的东西并声明开始、结束和一天对象:

import datetime
import matplotlib.pyplot as plt

end = datetime.date(2017,5,14) 
start = datetime.date(2017,5,8) 
one_day = datetime.timedelta(days = 1)  

然后我声明一个任意日期列表:

date_list = [datetime.date(2017,5,14), datetime.date(2017,5,14), 
datetime.date(2017,5,14), datetime.date(2017,5,9), datetime.date(2017,5,13), 
datetime.date(2017,5,12), datetime.date(2017,5,11), 
datetime.date(2017,5,11), datetime.date(2017,5,9)]

然后我遍历开始和结束之间的天数范围(在本例中为一周),将每个日期添加到列表中:

week = [] 
for i in range((end-start).days+1):  
    week.append(start + (i)*one_day)

原因是一周中的某些天没有出现在 date_list 中(我知道在这种情况下我可以跳过这个,但我希望它可以扩展到其他 date_lists)。

然后我用 hist() 进行绘图:

plt.hist(date_list, bins = len(week)+1)
plt.show()

我尝试了各种 bin 格式与各种 +1 和范围和对齐方式的组合,但日期从来没有在栏中的一致位置出现。

【问题讨论】:

  • 试试plt.hist(date_list, bins = len(week)+1, align='left')

标签: python datetime matplotlib histogram bins


【解决方案1】:

如果只是设置 bin 的数量,则 bin 将平均分布在(数据的)第一个值和最后一个值之间。由于数据是例如缺少start 值,垃圾箱将小于一整天。

要克服这一点,需要将所需的 bin 明确设置为 histbins 参数。不幸的是,这里不能直接使用日期时间列表,因此需要先将日期时间转换为数字。这可以使用 matplotlib 的 matplotlib.dates.date2num 方法来完成。

完整的例子:

import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import date2num

end = datetime.date(2017,5,14) 
start = datetime.date(2017,5,8) 
one_day = datetime.timedelta(days = 1)  

date_list = [datetime.date(2017,5,14), datetime.date(2017,5,14), 
datetime.date(2017,5,14), datetime.date(2017,5,9), datetime.date(2017,5,13), 
datetime.date(2017,5,12), datetime.date(2017,5,11), 
datetime.date(2017,5,11), datetime.date(2017,5,9)]

week = [] 
for i in range((end-start).days+1):  
    week.append(start + (i)*one_day)

numweek = date2num(week)

plt.hist(date_list, bins = numweek, ec="k")
plt.gcf().autofmt_xdate()
plt.show()

请注意,datetime.date(2017,5,14)(2017,5,13)(2017,5,14) 之间的 bin 的一部分,因此您可能希望将 enddate 设置为 datetime.date(2017,5,15).

【讨论】:

  • 非常感谢!我一直在为此烦恼
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2020-07-18
  • 2014-07-17
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多