Это должно работать для вас:
counts = arange(0, len(list_of_dates))
plot(list_of_dates, counts)
Вы, конечно, можете задать любой из обычных параметров для вызова plot
, чтобы график выглядел так, как вы этого хотите. (Я укажу, что matplotlib очень искусен в обработке дат и времени.)
Другим вариантом может быть Hist функция - она имеет параметр 'cumulative = True', который может быть полезен. Вы можете создать кумулятивную гистограмму, показывающую количество событий, которые произошли на любую данную дату, примерно так:
from pyplot import hist
from matplotlib.dates import date2num
hist(date2num(list_of_dates), cumulative=True)
Но при этом получается гистограмма, которая может быть не совсем той, которую вы ищете, и в любом случае для правильного отображения меток даты на горизонтальной оси, вероятно, потребуется некоторая путаница.
РЕДАКТИРОВАТЬ : у меня возникает ощущение, что вы действительно хотите получить одну точку (или гистограмму) за дату, а соответствующее значение y - это число событий, которые произошли до (и в том числе?) этой даты. В этом случае я бы предложил сделать что-то вроде этого:
grouped_dates = [[d, len(list(g))] for d,g in itertools.groupby(list_of_dates, lambda k: k.date())]
dates, counts = grouped_dates.transpose()
counts = counts.cumsum()
step(dates, counts)
Функция groupby
из модуля itertools
будет генерировать тот тип данных, который вы ищете: только один экземпляр каждой даты, сопровождаемый списком (фактически, итератором) всех datetime
объекты, которые имеют эту дату. Как предложил Джоуни в комментариях, функция step
будет отображать график, который повышается каждый день, когда происходили события, поэтому я бы предложил использовать его вместо plot
.
(Наконечник шляпы EOL за напоминание о cumsum
)
Если вы хотите получать одно очко за каждый день, независимо от того, происходили ли какие-либо события в этот день или нет, вам нужно будет немного изменить вышеприведенный код:
from matplotlib.dates import drange, num2date
date_dict = dict((d, len(list(g))) for d,g in itertools.groupby(list_of_dates, lambda k: k.date()))
dates = num2date(drange(min(list_of_dates).date(), max(list_of_dates).date() + timedelta(1), timedelta(1)))
counts = asarray([date_dict.get(d.date(), 0) for d in dates]).cumsum()
step(dates, counts)
Не думаю, что это действительно изменит график, созданный функцией step
.