这是一个数据集,其中包含将人员分配给角色的时间,并具有其开始日期和年份月,以便按其担任该角色的那几个月:
| ID | Name | strt_dt | end_dt | yearmo |
| 1 | Jay | 4-22-19 | 7-30-19| 201904 |
| 1 | Jay | 4-22-19 | 7-30-19| 201905 |
| 1 | Jay | 4-22-19 | 7-30-19| 201906 |
| 1 | Jay | 4-22-19 | 7-30-19| 201907 |
| 2 | Fao | 7-14-19 |10-14-19| 201907 |
| 2 | Fao | 7-14-19 |10-14-19| 201908 |
| 2 | Fao | 7-14-19 |10-14-19| 201909 |
| 2 | Fao | 7-14-19 |10-14-19| 201910 |
我要计算此人担任该角色的每个月月中该角色在该月中的多少天。输出应如下所示:
| ID | Name | strt_dt | end_dt | yearmo | no_of days|
| 1 | Jay | 4-22-19 | 7-30-19| 201904 | 9 |
| 1 | Jay | 4-22-19 | 7-30-19| 201905 | 31|
| 1 | Jay | 4-22-19 | 7-30-19| 201906 | 30|
| 1 | Jay | 4-22-19 | 7-30-19| 201907 | 30|
| 2 | Fao | 7-14-19 |10-14-19| 201907 | 18|
| 2 | Fao | 7-14-19 |10-14-19| 201908 | 31|
| 2 | Fao | 7-14-19 |10-14-19| 201909 | 30|
| 2 | Fao | 7-14-19 |10-14-19| 201910 | 14|
我试图从strt中提取它们的日期(减去30以获得dday的数目)和结束日期,并创建一个单独的列。但是我仍然坚持从那里着手。欢迎任何想法或建议。
df['strt_yearmo'] = df['strt_dt'].dt.year * 100 +df['strt_dt'].dt.month
df['end_yearmo'] = df['end_dt'].dt.year * 100 +df['end_dt'].dt.month
| ID | Name | strt_dt | end_dt | yearmo | strt_yearmo|end_yearmo|
| 1 | Jay | 4-22-19 | 7-30-19| 201904 | 201904 |201907|
| 1 | Jay | 4-22-19 | 7-30-19| 201905 | 201904 |201907|
| 1 | Jay | 4-22-19 | 7-30-19| 201906 | 201904 |201907|
| 1 | Jay | 4-22-19 | 7-30-19| 201907 | 201904 |201907 |
| 2 | Fao | 7-14-19 |10-14-19| 201907 | 201907 |201910 |
| 2 | Fao | 7-14-19 |10-14-19| 201908 | 201907 |201910 |
| 2 | Fao | 7-14-19 |10-14-19| 201909 | 201907 |201910 |
| 2 | Fao | 7-14-19 |10-14-19| 201910 | 201907 |201910 |
使用np.select(condition, choice,alternative)
强迫日期以日期时间和提取月末日期之后yearmo
提取月末日期frm yearmo
df['startmo']=pd.to_datetime(df['yearmo'].astype(str), format='%Y%m')+ pd.offsets.MonthEnd(0)
强制strt_dt
和end_dt
迄今为止
datedf['strt_dt'],df['end_dt']=pd.to_datetime(df['strt_dt']),pd.to_datetime(df['end_dt'])
提出条件
conditions=[df.startmo.dt.month==df.strt_dt.dt.month, df.startmo.dt.month==df.end_dt.dt.month]
#If month in yearmo is the same with strt_dt,substract strt_dt from endmont.
#If month in yearmo is the same with end_dt, extract the days in end_dt
提出与以上每个条件相对应的Choices核心
choices=[df.startmo.sub(df.strt_dt).dt.days+1,df.end_dt.dt.day]
通过匹配条件和选择来计算天数。包括替代品。这里的替代方案是开始和结束的月份与yearmo不匹配的地方,这意味着月份在中间,因此只需提取日期作为条件的替代方案
df['no_of days']=np.select(conditions,choices,df.startmo.dt.day)
ID Name strt_dt end_dt yearmo startmo no_of days
0 1 Jay 2019-04-22 2019-07-30 201904 2019-04-30 9
1 1 Jay 2019-04-22 2019-07-30 201905 2019-05-31 31
2 1 Jay 2019-04-22 2019-07-30 201906 2019-06-30 30
3 1 Jay 2019-04-22 2019-07-30 201907 2019-07-31 30
4 2 Fao 2019-07-14 2019-10-14 201907 2019-07-31 18
5 2 Fao 2019-07-14 2019-10-14 201908 2019-08-31 31
6 2 Fao 2019-07-14 2019-10-14 201909 2019-09-30 30
7 2 Fao 2019-07-14 2019-10-14 201910 2019-10-31 14
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句