python - 将日期放入月份
问题描述
现在我有一张桌子:
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
有人可以帮我吗?谢谢
解决方案
使用crosstab
将日期时间转换为月份Series.dt.to_period
,最后转换为月份名称PeriodIndex.strftime
,但在获取每个组的差异DataFrameGroupBy.diff
并过滤具有缺失值的行(每组的第一行)和小于或等于7
的行之前,如Series.ge
和boolean 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
推荐阅读
- java - JAVA:无法验证 XML 数字签名
- python - 是否有根据类型注释检查覆盖函数返回类型的python linter?
- batch-file - 批处理命令检查当前使用的系统语言,(不是默认语言)
- javascript - Firestore 认为我离线,即使我不在
- gps - FMB120 在 localhost 上截获来自设备的数据
- node.js - Passport序列化用户使用问题,怎么办?
- arrays - 如何从数组中获取数据?
- java - 按自定义顺序对字符串元素数组进行排序
- c++ - 如何在 C++ 中返回具有原子成员的结构
- cordova - 如何显示离线网站视图 Cordova?