根据某些日期是不是介于 python 中的某个时间之间来查找唯一会员的付款总和
Posted
技术标签:
【中文标题】根据某些日期是不是介于 python 中的某个时间之间来查找唯一会员的付款总和【英文标题】:Looking to find the sum of a unique member's payment based of whether some dates fall in between a certain time in python根据某些日期是否介于 python 中的某个时间之间来查找唯一会员的付款总和 【发布时间】:2021-06-30 05:52:57 【问题描述】:这是我第一次在社区上提问,尽管我过去曾广泛使用该网站寻求帮助。我无法找到解决这个特定问题的方法,而且我对 python 相当熟悉,因此很难将逻辑放入代码中,尽管我认为逻辑足够清晰。为此,我正在通过 google colab 使用 python,并在最后共享了一个带有数据的 google 表。
在我的场景中,我们有一个开始月份、时间长度和付款月份。结束月份可以通过长度来计算。一个人可以是多个组的一部分,因此可以有多个开始、结束和支付月份。
我们的目标是找出会员在今天休息时应该支付多少费用。
例如小组从 2020 年 1 月开始,为期 10 个月,将于 2020 年 10 月结束。每月捐款为 5k。支付月份可以说是 2020 年 3 月。虽然从技术上讲,我们应该收到 10 笔付款(10 个月组),但我们预计只有 9 笔付款,即 45k,因为当付款月份到来时,预计会员不会支付该月的费用。如果说该小组从 2020 年 12 月开始,并且持续了 10 个月,那么从今天开始,我们预计只需要 5 次付款(12 月到 4 月 21 日)。
这些情况会变得复杂,例如,当成员属于 3 个组时,即 3 个开始日期、3 个结束日期和 3 个付款日期以及可能 3 个不同的分期付款金额。假设开始日期是 1 月 20 日、2 月 20 日、3 月 20 日,所有组都是 10 个月。还可以说在 4 月 20 日有付款。在 4 月 20 日,所有组都将处于活动状态(尚未到达结束月份),因此在 4 月 20 日(付款月份),我们预计所有组都不会付款组。
这意味着,如果有 3 个组,并且在任何组的开始和结束月份之间有付款,那么我们预计不会在该月为该组付款。如果在组的开始月份和结束月份之间有两次付款,那么我们不会期望该月有 6 次付款,每个组 2 次,依此类推。如果说 3 组和 1 笔支出在仅 2 组的日期之间,那么我们将不会期望仅针对这两组的分期付款(这些组的分期付款是什么)
以下 google sheet 有一些示例数据。 组 ID col 是完全唯一的,并且没有重复(您可以将其视为发票,因为所有发票都是唯一的)。成员代码 col 可以有重复,因为成员可以有多个组。不要担心日期中的日子,重要的是月份和年份。我们有开始月份、组长度和支付月份。我们还知道该组的成员每月欠多少钱。 https://docs.google.com/spreadsheets/d/1nAXlifIQdYiN1MWTv7vs2FqbFu2v6ykCzQjrJNPTBWI/edit#gid=0
任何帮助或建议都会很棒。
已编辑 -> 我尝试了以下方法,但出现错误:(我编码了月份,即 2020 年 1 月 = 1、2020 年 2 月 = 2 等等,所以我不必乱搞日期)
deal_list = df['Group ID'].tolist()
def instalment(deal_list):
for member in df['Member Code'].unique():
if df['Coded Payout Month']>=df['Coded Start Month'] and df['Coded
Payout Month']<=df['Coded End Month']:
count_months = count_months + 1
return count_months * df['Instalment']
instalment(deal_list)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
已编辑 - 刚才还尝试了以下方法(从 Pandas: Groupby and iterate with conditionals within groups? 获得帮助)。它有点起作用,因为它给了我每行 1 的计数。我试图获取每个付款月份出现在组日期内的次数
grouped = df.groupby('Member Code')
for g_idx, group in grouped:
for r_idx, row in group.iterrows():
if (((row['Coded Payout Month'] >= group['Coded Start Month']).any())
& (row['Coded Payout Month'] <= group['Coded End Month']).any()):
df.loc[r_idx, 'payout_cut'] =+ 1
print(df)
【问题讨论】:
欢迎来到 SO。虽然它不是明确的指导方针@How to Ask 的一部分,但通常对 SO 问题的期望是介绍要简洁。 “minimal reproducible example”原则也适用于展示。考虑进行编辑以过滤掉对理解您的问题并不重要的信息,并将您尝试过的代码集成到您的问题中。 已经消除了一些噪音! 【参考方案1】:我找到了解决方法。本质上,我没有尝试遍历所有行,而是首先通过转置和过滤器将我的数据转换为谷歌表格中的长格式(我过滤了成员的所有付款月份并将结果转置到行中。然后我将其推送到colab 并通过 pd.melt 将数据转换回每笔交易的唯一行,并根据需要额外支付。然后运行条件非常简单,最后对所有真实值求和。
我可以解释更多任何人的需求。 我从这里获得灵感: https://youtu.be/pKvWD0f18Pc
【讨论】:
以上是关于根据某些日期是不是介于 python 中的某个时间之间来查找唯一会员的付款总和的主要内容,如果未能解决你的问题,请参考以下文章
在插入 SQLite 之前检查表 B 中的日期是不是介于表 A 中的日期之间