我正在按医院工作人员每月的工作时间分组。我每天都有原始数据,如下所示。
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。
请让我知道我在这里做错了。
答案 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
和每个月的最后一天