熊猫:按双月日期字段分组

时间:2018-11-01 07:42:26

标签: python pandas

我正在按医院工作人员每月的工作时间分组。我每天都有原始数据,如下所示。

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 :(得分:2)

将日期时间值放入容器中

如果我答对了,您基本上想将date列中的值放入垃圾箱。为此,熊猫提供了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      

答案 1 :(得分:2)

您几乎在那里。这样就可以了-

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和每个月的最后一天

相关问题