Pandas:按两月分组的日期字段

5

我想按照医院工作人员的工作时间双月度进行分组。我有每天的原始数据,如下所示。

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

How I want to group by is.

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

我正在尝试使用Pandas中的grouper和frequency实现以下功能。
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()

我也尝试过 重新采样

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。请告诉我我在这里做错了什么。
3个回答

4
你已经接近成功了。这样做就可以了 -
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'是半月的概念,它将使用每个月的第15天和最后一天。

2

将日期时间值放入箱中

如果我理解正确,您基本上想将日期列中的值放入箱中。为此,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      

0

有一个类似的问题,这是我的解决方案:

df1['BiMonth'] = df1['Date'] + pd.DateOffset(days=-1) + pd.offsets.SemiMonthEnd()
df1['BiMonth'] = df1['BiMonth'].dt.to_period('D')

构造函数 "df1['Date'] + pd.DateOffset(days=-1)" 将获取日期列中的任何内容并减去1天。

构造函数 "+ pd.offsets.SemiMonthEnd()" 将其转换为双月篮子,但除非您将参考日期减少1天,否则会有一天的偏差。

构造函数 "df1['BiMonth'] = df1['BiMonth'].dt.to_period('D')" 清除时间,因此只剩下天数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接