首页 > 解决方案 > 将日期放入月份

问题描述

现在我有一张桌子:

Score  Customer ID      my_dates        Threshold Model_name   is_alert
50         8           2017-08-05         50     Mod1          yes
50         9           2017-12-05         50     Mod1          yes
50         28          2017-05-22         50     Mod2          yes
50         28          2017-05-26         50     Mod2          yes
50         36          2017-06-20         50     Mod2          yes

如果分数等于或超过阈值,is_alert 将显示“是”

现在我想将日期放入以下格式并打印每个模型下每个 bin 中有多少警报,但如果在 7 天内对一个客户发出多次警报,则只有第一次命中才会计入总分:

Model_name   Jan-17    Feb-17    Mar-17    APR-17   May-17   Jun-17 
Mod1                                                           
Mod2                                                           

有人可以帮我吗?谢谢

标签: pythonpandaspython-datetimepython-dateutil

解决方案


使用crosstab将日期时间转换为月份Series.dt.to_period,最后转换为月份名称PeriodIndex.strftime,但在获取每个组的差异DataFrameGroupBy.diff并过滤具有缺失值的行(每组的第一行)和小于或等于7的行之前,如Series.geboolean indexing

df['my_dates'] = pd.to_datetime(df['my_dates'])

m = df['my_dates'].dt.to_period('m')
df['diff'] = df.groupby(['Model_name'])['my_dates'].diff().dt.days
print (df)
   Score  Customer ID   my_dates  Threshold Model_name is_alert   diff
0     50            8 2017-08-05         50       Mod1      yes    NaN
1     50            9 2017-12-05         50       Mod1      yes  122.0
2     50           28 2017-05-22         50       Mod2      yes    NaN
3     50           28 2017-05-26         50       Mod2      yes    4.0
4     50           36 2017-06-20         50       Mod2      yes   25.0

df = df[df['diff'].ge(7) | df['diff'].isna()]
df1 = pd.crosstab(df['Model_name'], m)
df1.columns = df1.columns.strftime('%b-%y')
print (df1)
my_dates    May-17  Jun-17  Aug-17  Dec-17
Model_name                                
Mod1             0       0       1       1
Mod2             1       1       0       0

推荐阅读