Все работает хорошо, но для образца данных 1
, потому что groupby
по столбцам time
и id
и для каждой пары получают размер групп 1
:
print (df2.groupby(['time','id']).count()['w'])
time id
2017-04-03 18:09:04 39 1
2017-04-03 18:16:04 39 1
2017-04-03 18:23:04 39 1
2017-04-03 18:30:04 39 1
2017-04-03 18:37:04 39 1
2017-04-03 18:44:04 40 1
2017-04-03 18:51:04 40 1
2017-04-03 18:58:04 40 1
2017-04-03 19:05:04 40 1
2017-04-03 19:12:04 40 1
Name: w, dtype: int64
Тогда преобразованный вывод будет DataFrame
с 2 столбцами, заполненными 1
и NaN
s для значений, которые не существуют в парах:
df = df2.groupby(['time','id']).count()['w'].unstack()
print (df)
id 39 40
time
2017-04-03 18:09:04 1.0 NaN
2017-04-03 18:16:04 1.0 NaN
2017-04-03 18:23:04 1.0 NaN
2017-04-03 18:30:04 1.0 NaN
2017-04-03 18:37:04 1.0 NaN
2017-04-03 18:44:04 NaN 1.0
2017-04-03 18:51:04 NaN 1.0
2017-04-03 18:58:04 NaN 1.0
2017-04-03 19:05:04 NaN 1.0
2017-04-03 19:12:04 NaN 1.0
Если значения являются только датамипоэтому нужно Grouper
на 7d
для недели или MS
для начала месяца вместо time
столбцов (также добавлен параметр fill_value=0
для замены NaN
s на 0
):
df = df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0)
print (df)
buildingid 39 40
reporttime
2018-03-01 7 5
2018-03-08 1 0
2018-04-19 1 0
2018-04-26 5 4
Итак, наконец, ваш код выглядит так:
fig, ax = plt.subplots(figsize=(15,7))
df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0).plot(ax=ax)