首页 > 解决方案 > 计算 ID 在随后的 180 天内出现的次数

问题描述

我有一个包含以下列的熊猫数据框:

REF_ID       REPORT_DATE_RAW
12345      2019-02-21 20:53:00  

我想查看每个细节REF_ID,以及它是否在之后的 180 天内被多次报告REPORT_DATE_RAW如果在随后的 180 天内未出现,则视为误报。如果是,我想返回 1,如果不是,我想返回 0。

我需要为每个 REF_ID 执行此操作。我试图用 groupby 和滚动总和来做到这一点,在这里引用了另一个类似的问题。这是我目前拥有的:

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

delta=180
df = df.set_index('REPORT_DATE_RAW').assign(count=1).groupby('REF_ID').rolling(f'{delta}D').sum() - 1

这将返回:

REF_ID   REPORT_DATE_RAW      count
8637    2019-10-25 16:39:00    0.0
8637    2019-10-31 10:38:00    1.0

我不确定我是否可以对这些结果进行分析....我不确定为什么第一次出现的计数为 0 而另一个计数为 1。这两个 REF_ID 在 180 天内,所以我只想将此 REF_ID 计为 1,以便我可以计算出有多少 REF_ID 被视为误报。

提前致谢。这个项目对时间非常敏感,所以我很感激帮助

标签: pythonpython-3.xpandasdatetimetime-series

解决方案


利用:

(df.set_index('REPORT_DATE_RAW').groupby('REF_ID')
 .apply(lambda x: (x[::-1].rolling('180d').count() > 1)[::-1].astype(int))
)

[::-1]符号向前rolling逼近的地方。


注意:Pandas 作为pd.api.indexers.FixedForwardWindowIndexer转发功能,但它似乎不适用于日期时间窗口。


推荐阅读