Панды: Группировка по полугодовой дате - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь сгруппировать по больничному персоналу рабочее время раз в два месяца. У меня есть необработанные данные на ежедневной основе, которые выглядят как ниже.

date       hourse_spent emp_id  
9/11/2016     8          1  
15/11/2016    8          1  
22/11/2016    8          2  
23/11/2016    8          1

Как я хочу группировать это.

cycle                 hourse_spent      emp_id   
1/11/2016-15/11/2016      16                 1
16/11/2016-31/11/2016      8                 2
16/11/2016-31/11/2016      8                 1

Я пытаюсь сделать то же самое с групером и частотой в пандах, как показано ниже.

data.set_index('date',inplace=True)
print data.head()
dt = data.groupby(['emp_id', pd.Grouper(key='date', freq='MS')])['hours_spent'].sum().reset_index().sort_values('date')

#df.resample('10d').mean().interpolate(method='linear',axis=0)
print dt.resample('SMS').sum()

Я тоже пробовал resampling

df1 = dt.resample('MS', loffset=pd.Timedelta(15, 'd')).sum()
data.set_index('date',inplace=True)
df1 = data.resample('MS', loffset=pd.Timedelta(15, 'd')).sum()

Но это дает данные с 15-дневным интервалом, отличным от 1 до 15 и с 15 до 31.

Пожалуйста, дайте мне знать, что я здесь делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы были почти там. Это сделает это -

dt = df.groupby(['emp_id', pd.Grouper(key='date', freq='SM')])['hours_spent'].sum().reset_index().sort_values('date')

emp_id  date    hours_spent
1   2016-10-31  8
1   2016-11-15  16
2   2016-11-15  8

Я оставляю в качестве тривиального упражнения диапазон дат вместо даты окончания для каждой группы

freq='SM' - это концепция полумесяца, в которой будет использоваться 15th и последний день каждого месяца

0 голосов
/ 01 ноября 2018

Поместить значения DateTime в значения Bins

Если я вас правильно понял, вы, в основном, хотите поместить свои значения в столбце даты в ячейки. Для этого в pandas включена функция pd.cut(), которая делает именно то, что вы хотите.

Вот подход, который может вам помочь:

import pandas as pd
df = pd.DataFrame({
  'hours'  : 8,
  'emp_id' : [1,1,2,1],
  'date'   : [pd.datetime(2016,11,9),
              pd.datetime(2016,11,15),
              pd.datetime(2016,11,22),
              pd.datetime(2016,11,23)]
     })
bins_dt = pd.date_range('2016-10-16', freq='SM', periods=3)
cycle = pd.cut(df.date, bins_dt)
df.groupby([cycle, 'emp_id']).sum()

Что вам дает:

cycle                    emp_id hours 
------------------------ ------ ------
(2016-10-31, 2016-11-15] 1      16    
                         2      NaN   
(2016-11-15, 2016-11-30] 1      8     
                         2      8      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...