在 pandas 中查找每月某个时间范围内发生的定期付款

Posted

技术标签:

【中文标题】在 pandas 中查找每月某个时间范围内发生的定期付款【英文标题】:find recurring payments that occur within a time frame monthly in pandas 【发布时间】:2021-12-26 17:50:39 【问题描述】:

我有一个数据框,我想查找相同 ID 的定期付款(仅当金额相同且月份中的某天相同且存在误差(+-5 天)时。 我做了以下事情:

d = 'id':[1,1,1,3,3,3,5,5,5],
    'day_of_month':[2,2,5,4,6,8,10,15,25],
    'amount':[1000,1000,50,1500,3000,1500,4000,2000,2000]
dd = pd.DataFrame(d)
print(dd)
    id  day_of_month    amount
0   1     2            1000
1   1     2            1000
2   1     5             50
3   3     4            1500
4   3     6            3000
5   3     8            1500
6   5     10           4000
7   5     15           2000
8   5     25           2000

然后我这样做:

dd[dd.duplicated(subset = ['id','amount'], keep = False)]
    id  day_of_month       amount
0   1      2                1000
1   1      2                1000
3   3      4                1500
5   3      8                1500
7   5      15               2000
8   5      25               2000

如您所见,输出的最后一行是误报,因为我没有设法实现当月的 +-5 天窗口。 我想要的输出应该是这个

   id       day_of_month    amount
0   1      2                1000
1   1      2                1000
3   3      4                1500
5   3      8                1500

关于如何实现我需要的任何想法?谢谢!

【问题讨论】:

【参考方案1】:

为什么不添加另一个mask

你原来的mask

non_duplicates_mask = dd.duplicated(subset = ['id','amount'], keep = False)

月月mask:

months_mask = abs(dd['day_of_month'] - dd['day_of_month'].shift()) >= 5

我使用abs 以防day_of_month 并不总是按升序排列,

然后使用两个掩码应用xor 操作:

dd[non_duplicates_mask ^ months_mask]

输出:

    id  day_of_month    amount
0   1   2               1000
1   1   2               1000
3   3   4               1500
5   3   8               1500

编辑: xor (eXclusive OR) 的操作如下:

【讨论】:

感谢您的回答。我以前从未使用过异或操作。它到底在做什么? @Unicorn07 我已经添加了xor 的可视化表示,并且如果答案确实解决了您的问题,不要忘记投票并勾选绿色 v :)

以上是关于在 pandas 中查找每月某个时间范围内发生的定期付款的主要内容,如果未能解决你的问题,请参考以下文章

查找并计算列表中某个范围内所有出现的数字和位置

Laravel Eloquent 在 JSON 列中查找日期在某个范围内的所有记录

在 Pandas 数据框中查找每三列的平均值

按在 Pandas 中开始和结束的日期范围扩展行

如何使用pyspark查找时间范围内每分钟发生的事件

如果列值在一定范围内彼此接近,则删除 pandas 行