无法使用hist()函数在日期时间对象的直方图中对齐bin

时间:2017-05-13 14:15:47

标签: python datetime matplotlib histogram bins

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

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

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()

我尝试过各种各种+ 1和范围的bin格式组合并对齐,但日期永远不会位于栏中的一致位置。

1 个答案:

答案 0 :(得分:4)

如果只是设置箱的数量,则箱子将在(数据的)第一个和最后一个值之间平均分配。由于数据是例如错过了<div class="col-lg-12"> <sebm-google-map [latitude]="lat" [longitude]="lng"> <sebm-google-map-marker *ngFor="let marker of markers" [latitude]="marker.latitude" [longitude]="marker.longitude"> </sebm-google-map-marker> </sebm-google-map> </div>值,这些垃圾箱将小于一整天。

为了解决这个问题,需要明确地将所需的bin设置为start的{​​{1}}参数。遗憾的是,这里不能直接使用日期时间列表,因此需要先将日期时间转换为数字。这可以使用matplotlib的bins方法完成。

完整的例子:

hist

enter image description here

请注意,matplotlib.dates.date2numimport 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)之间的bin的一部分,因此您可能希望将enddate设置为 (2017,5,13)