作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个使用情况跟踪器,标记在上次标记 ID 后 14 天内具有相同 ID 的项目。因此,如果相同的 ID 出现在第一个 ID 的 14 天内,则无标记,如果它出现在第一个标记的 14 天内,则它成为每个 ID 的第二个标记。
我尝试过使用 .ffill() .groupby .rolling
这些有助于在 14 天内查找重复项,但对滚动标志没有帮助。我认为解决方案可能在于带有扩展窗口的 for
循环的某个时间?
起始代码
df:
date id
1/1/19 38
1/5/19 16
1/10/19 38
1/15/19 38
1/21/19 38
1/30/19 16
2/2/19 38
2/2/19 38
2/3/19 38
我最终需要什么
df2:
date id flag most recent flag
1/1/19 38 True 1/1/19
1/5/19 16 True 1/5/19
1/10/19 38 False 1/1/19
1/15/19 38 True 1/15/19
1/21/19 38 False 1/15/19
1/30/19 16 True 1/30/19
2/2/19 38 True 2/2/19
2/2/19 38 False 2/2/19
2/3/19 38 False 2/2/19
最佳答案
抱歉让您久等了
这里是生成df的代码,如上所示
df = pd.DataFrame({
'date':['1/1/19','1/5/19','1/10/19','1/15/19','1/21/19','1/30/19','2/2/19','2/2/19','2/3/19'],
'id':[38,16,38,38,38,16,38,38,38]
})
df['date'] = pd.to_datetime(df['date'])
而且,这些是我在计算您的标志之前创建的其他列
df['days_ago'] = df.groupby('id')['date'].diff()\
.fillna(pd.Timedelta(seconds=0)).astype('timedelta64[D]').astype(int)
df['days_ago_cumsum'] = df.groupby('id')['days_ago'].cumsum()
而且,这是计算该标志的函数
def get_fixed_day_flag(days_ago_cumsum, within=14):
while True:
cond = days_ago_cumsum >= within
days_ago_cumsum_min = days_ago_cumsum.where(cond).min()
new_days_ago_cumsum = days_ago_cumsum.where(cond) - days_ago_cumsum_min
cond = new_days_ago_cumsum.notna()
days_ago_cumsum[cond] = new_days_ago_cumsum[cond].astype(int)
if days_ago_cumsum.max() < within:
return days_ago_cumsum == 0
完成这两行
df['flag'] = df.groupby('id')['days_ago_cumsum'].transform(get_fixed_day_flag)
df['flag'] = df['flag'] & ~df.duplicated(subset=['date','id'])
关于python - 如何在 Python 中创建日期时间使用跟踪器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729625/
我是一名优秀的程序员,十分优秀!