Итак, у меня есть pandas dataframe, который имеет большое количество столбцов, и один из столбцов является меткой времени в формате datetime.Каждая строка в кадре данных представляет одно «событие».То, что я пытаюсь сделать, это график частоты этих событий с течением времени.В основном это простая гистограмма, показывающая, сколько событий в месяц.
Начинается с этого кода:
data.groupby([(data.Timestamp.dt.year),(data.Timestamp.dt.month)]).count().plot(kind = 'bar')
plt.show()
Этот «вид» работает.Но есть 2 проблемы:
1) На графике имеется легенда, которая включает все столбцы в исходных данных (например, более 30 столбцов).И у каждого столбца на графике есть крошечный суббар для каждого из столбцов (все они имеют одинаковое значение, так как я просто считаю события).
2) В некоторых месяцах нольСобытия.И эти месяцы вообще не отображаются на графике.
Я наконец-то придумал код, чтобы график выглядел так, как я хотел.Но мне кажется, что я не делаю это «правильным» способом, поскольку это должен быть довольно распространенный вариант использования.
По сути, я создал новый фрейм данных с одним столбцом «count» и индексом, который являетсястроковое представление месяца / года.Я заполнил это нулями во временном интервале, который мне небезразличен, а затем скопировал данные из первого кадра в новый.Вот код:
import pandas as pd
import matplotlib.pyplot as plt
cnt = data.groupby([(data.Timestamp.dt.year),(data.Timestamp.dt.month)]).count()
index = []
for year in [2015, 2016, 2017, 2018]:
for month in range(1,13):
index.append('%04d-%02d'%(year, month))
cnt_new = pd.DataFrame(index=index, columns=['count'])
cnt_new = cnt_new.fillna(0)
for i, row in cnt.iterrows():
cnt_new.at['%04d-%02d'%i,'count'] = row[0]
cnt_new.plot(kind = 'bar')
plt.show()
Кто-нибудь знает более простой способ сделать это?
РЕДАКТИРОВАТЬ -> По запросу, вот идея типа фрейма данных.Это результаты запроса SQL.Фактические данные - это моя компания, так что ...
Timestamp FirstName LastName HairColor \
0 2018-11-30 02:16:11 Fred Schwartz brown
1 2018-11-29 16:25:55 Sam Smith black
2 2018-11-19 21:12:29 Helen Hunt red
Хорошо, так что я думаю, что получил.Спасибо Юке за повторную команду.Мне просто нужно запустить это на серии данных Timestamp (а не на всем фрейме данных), и это даст мне именно то, что я искал.
> data.index = data.Timestamp
> data.Timestamp.resample('M').count()
Timestamp
2017-11-30 0
2017-12-31 0
2018-01-31 1
2018-02-28 2
2018-03-31 7
2018-04-30 9
2018-05-31 2
2018-06-30 6
2018-07-31 5
2018-08-31 4
2018-09-30 1
2018-10-31 0
2018-11-30 5