如何用日期时间序列中的月份构建列?

时间:2019-04-23 02:23:45

标签: pandas pandas-groupby

所以我有ID,日期以及他们当天是否进行过活动的数据

ID             DATE              DONE  
1           2009-1-3             Yes
1           2009-1-15            Yes
2           2009-9-3             Yes
3           2009-10-7            No
1           2009-12-1            Yes
3           2009-10-8            Yes
2           2009-10-21           Yes

所以我想分组并创建包含月份和1的列(如果他们在当月0点。)

ID 2009-1 2009-2 ... 2009-9 2009-10 2009-11 2009-12
1     1     0    ...   0         0       0     1
2     0     0    ...   1         1       0     0
3     0     0    ...   0         0       0     0

谢谢

3 个答案:

答案 0 :(得分:1)

先使用Series groupby + all,然后再使用unstack

s=df['DONE'].eq('Yes').\
      groupby([df['ID'],df.DATE.dt.strftime('%Y-%m')]).\
          all().astype(int).unstack(fill_value=0)
s
Out[1026]: 
DATE  2009-01  2009-09  2009-10  2009-12
ID                                      
1           1        0        0        1
2           0        1        1        0
3           0        0        0        0

答案 1 :(得分:1)

另一种方式

Setup

df.DATE = pd.to_datetime(df.DATE)
df.DONE = df.DONE.map({'Yes':1, 'No':0})

Solution

然后创建200901样式的辅助int列

df['DATE2']=df.DATE.dt.year.astype(str).add(df.DATE.dt.month.astype(str).str.zfill(2)).astype(int)

pivot_table + reindex

df.pivot_table(columns='DATE2', index='ID', values='DONE').reindex(np.arange(200901, 200913), axis='columns').fillna(0)


DATE2   200901  200902  200903  200904  200905  200906  200907  200908  200909  200910  200911  200912
ID                                              
1       1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0
2       0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0     1.0     0.0     0.0
3       0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.5     0.0     0.0

答案 2 :(得分:1)

我知道我来晚了,但是我认为这个解决方案也很不错:

df['DATE'] = pd.to_datetime(df['DATE']).dt.strftime('%Y-%m')
(df.pivot(columns='DATE', values='DONE') == 'Yes') + 0