Невозможно выровнять ячейки в гистограмме объектов datetime с помощью функции hist()

Поэтому я пытаюсь построить гистограмму некоторых объектов даты и времени, но я никогда не смогу выровнять ячейки по столбцам. Мой код ниже:

Я начинаю с того, что импортирую свои вещи и объявляю начало, конец и однодневный объект:

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

Тогда я заговор с историей ():

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

Я испробовал всевозможные комбинации форматов бина с различными +1 и диапазонами и выравниванием, но дата никогда не сидит в согласованном месте на панели.

1 ответ

Решение

Если просто установить количество ячеек, то они будут равномерно распределены между первым и последним значением (данных). Так как данные, например, отсутствуют start значение, контейнеры будут меньше, чем полный день.

Чтобы преодолеть это, нужно явно установить желаемые ячейки для bins аргумент hist, К сожалению, здесь нельзя напрямую использовать список дат и времени, поэтому сначала нужно конвертировать даты и числа в числа. Это можно сделать с помощью 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), так что вы можете установить конечную дату в datetime.date(2017,5,15),

Другие вопросы по тегам