Построение списка объектов даты и времени в виде линейного графика в matplotlib

У меня есть отсортированный список объектов даты и времени следующим образом:

X = [datetime.date(2017, 1, 14), datetime.date(2017, 1, 14), datetime.date(2017, 1, 16), datetime.date(2017, 1, 16), datetime.date(2017, 1, 18), datetime.date(2017, 1, 22), datetime.date(2017, 1, 24), datetime.date(2017, 1, 24), datetime.date(2017, 1, 29), datetime.date(2017, 2, 4), datetime.date(2017, 2, 10), datetime.date(2017, 2, 22), datetime.date(2017, 2, 28), datetime.date(2017, 3, 8), datetime.date(2017, 3, 28), datetime.date(2017, 4, 17), datetime.date(2017, 4, 20), datetime.date(2017, 4, 20), datetime.date(2017, 5, 16), datetime.date(2017, 5, 26), datetime.date(2017, 6, 12), datetime.date(2017, 6, 23), datetime.date(2017, 6, 28), datetime.date(2017, 7, 28), datetime.date(2017, 8, 14), datetime.date(2017, 8, 29), datetime.date(2017, 8, 29), datetime.date(2017, 9, 26), datetime.date(2017, 10, 4), datetime.date(2017, 10, 5), datetime.date(2017, 10, 8), datetime.date(2017, 11, 20), datetime.date(2017, 12, 2), datetime.date(2017, 12, 11), datetime.date(2017, 12, 11), datetime.date(2018, 2, 14), datetime.date(2018, 2, 16), datetime.date(2018, 3, 2), datetime.date(2018, 3, 5), datetime.date(2018, 3, 28)]

Цель состоит в том, чтобы построить линейный график с осью X в качестве даты и осью Y в качестве номера. раз каждая из дат появляется в списке. Я понимаю, что самый слабый способ получить линейную диаграмму - удалить дубликаты из X, сгенерировать другой список Y, который содержит частоту каждого объекта datetime в X, и выполнить

plt.plot(X,Y)

Но есть ли более умный / более питонский способ сделать это?

Я уже читал Plotting time в Python с Matplotlib, но это не помогает.

1 ответ

Решение

В общем, matplotlib не предоставляет способов агрегирования ваших данных. В конце концов, это библиотека заговоров.

Вместо этого вы можете положиться на встроенные опции Python или использовать другие пакеты, такие как numpy или pandas.

Например, используя numpy.unique:

import numpy as np
import matplotlib.pyplot as plt
import datetime

Z = [datetime.date(2017, 1, 14), datetime.date(2017, 1, 14), ...,
    ..., datetime.date(2018, 3, 28)] # data from question

X,Y = np.unique(Z, return_counts=True)

plt.plot(X,Y)

plt.show()
Другие вопросы по тегам