2016-03-01 2 views
0

Я пытаюсь создать столбчатую диаграмму общего времени за билет на одного пользователя в день, мой DataFrame выглядит следующим образом:Python панд ресэмплировать в день, группы по значению

date_timestamp  ticket time user 
23/03/2015 12:00:00 D-146 120 blgo 
04/04/2015 12:00:00 D-173 15 blgo 
29/04/2015 12:00:00 P-110 60 frle 
29/04/2015 15:47:29 P-113 180 chki 
29/04/2015 15:47:55 P-113 30 chki 
30/04/2015 12:00:00 P-108 240 frle 
30/04/2015 12:00:00 P-116 120 hahe 
30/04/2015 13:46:25 P-116 240 hahe 
01/05/2015 09:20:48 P-113 120 frle 
01/05/2015 09:39:13 P-107 45 frle 

Каждый бар на графике будет представлять одного пользователя в один день - высота бара будет представлять общее время, проведенное в этот день за считанные минуты, и будет разделено пропорционально количеству времени, которое пользователь выполнил в каждом билете в тот день.

Я знаю, что я могу получить общее время в день для каждого пользователя, используя следующие:

df[(df.user == 'blgo')]['time'].resample('B',how='sum').fillna(0) 

Я также знаю, что я могу сгруппировать dataframe билетом следующим образом:

df2=df['time'].groupby(df['ticket']) 

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

Любая помощь или совет будут оценены.

+0

Хотите ли вы _fraction_ времени каждый пользователь провел на данный билет на определенный день, чтобы быть представленными, или _time_? (Например, в вашем примере пользователь «frle» каким-то образом потратил 54 часа на P-108 30/04/2015, в то время как пользователь «провел» шесть часов на P-116 в тот день, если они оба будут представлены как «100 % от времени пользователя »или увеличено до абсолютных часов?) –

+0

Я хочу * время * - в некоторых случаях это может привести к тому, что ежедневная сумма будет составлять более 24 часов в день, но все в порядке. Тем не менее, я поправлю таблицу, потому что это может смутить некоторых людей, спасибо, что указали это. – Charon

ответ

1

Возможно, вы захотите сделать несколько дополнительных настроек в зависимости от того, как вы хотите обрабатывать дни без вклада конкретного пользователя, но основная структура, которую вы хотите, - это pivot table. Начиная с вашего dataframe:

df.reset_index() 
df['date'] = df['date_timestamp'].dt.date 
del df['date_timestamp'] 
df2 = pd.pivot_table(df, index=['date', 'user'], columns=['ticket'], values='time', aggfunc=np.sum) 
df2.fillna(value=0, inplace=True) 
df2.plot(kind='bar', stacked=True) 

enter image description here

+0

Вот и все - большое вам спасибо! Раньше я слышал о сводных таблицах, но никогда не использовал их. Я понимаю их сейчас. К сожалению, в моем исходном наборе данных есть 5000 строк и много пользователей, поэтому попытка вышеописанного кода сбрасывает мою машину, но, конечно, это то, с чем мне приходится бороться. Однако он отлично работает, когда я сжимаю его только одному пользователю. Кстати, предположительно 5-я и 6-я строки должны начинаться с 'df2'? – Charon

+0

Спасибо, я исправил опечатки. Подмножество в день может помочь, если ваш исходный набор данных слишком велик для вашей машины. –

Смежные вопросы