【发布时间】:2021-05-07 09:27:43
【问题描述】:
我是python的初学者,希望你能帮我解决我的问题。
我有以下数据框:
account_id contract_id date_activated term_months 2020-08-01 00:00:00 2020-09-01 00:00:00 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00 2021-01-01 00:00:00 2021-02-01 00:00:00 2021-03-01 00:00:00 2021-04-02 00:00:00
0 12454545 ADD 2020-08-24 11 620.984848 620.984848 620.984848 620.984848 0.0 0.0 0.00 0.00 0.00
1 12454545 ADFGG 2021-02-01 12 0.000000 0.000000 0.000000 0.000000 0.0 0.0 687.94 687.94 687.94
2 1646468 ASDADGAD 2020-08-03 7 1504.700000 1504.700000 1504.700000 1504.700000 1504.7 1504.7 1504.70 0.00 0.00
3 5454555 ADGA 2020-08-10 8 528.000000 528.000000 528.000000 528.000000 528.0 528.0 0.00 0.00 528.00
4 48654 GHDG 2018-10-18 6 100.000000 100.000000 100.000000 0.000000 0.0 0.0 0.00 0.00 0.00
我想要以下输出:
account_id contract_id date_activated term_months status 2020-08-01 00:00:00 2020-09-01 00:00:00 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00 2021-01-01 00:00:00 2021-02-01 00:00:00 2021-03-01 00:00:00 2021-04-02 00:00:00
0 12454545 ADD 2020-08-24 11 Active 620.984848 620.984848 620.984848 620.984848 0.0 0.0 0.00 0.00 0.00
1 12454545 ADFGG 2021-02-01 12 Active 0.000000 0.000000 0.000000 0.000000 0.0 0.0 687.94 687.94 687.94
2 1646468 ASDADGAD 2020-08-03 7 Inactive 1504.700000 1504.700000 1504.700000 1504.700000 1504.7 1504.7 1504.70 0.00 0.00
3 5454555 ADGA 2020-08-10 8 Active 528.000000 528.000000 528.000000 528.000000 528.0 528.0 0.00 0.00 528.00
4 48654 GHDG 2018-10-18 6 Inactive 100.000000 100.000000 100.000000 0.000000 0.0 0.0 0.00 0.00 0.00
每个帐户可以有一份或多份合同。我有一个外部数据,应手动设置以确定当前日期,在本例中为“2021 年 5 月 1 日”。
我需要根据付款(带有日期的标题)和以月为单位的期限将每份合同标识为“有效”或“无效”。这将在一个新的列“状态”中。停止付款的人有 4 个月的宽限期。
如果合同每月支付(没有未付款)等于其期限,并且已经在当前日期之前结束其期限(基于 term_months),它将被视为“无效”。请参阅contract_id "ASDADGAD"。
如果合同一直在定期付款并且截至当前日期尚未到期,则该合同将被视为“有效”。参考contract_id“ADFGG”。
如果合同尚未到期(基于期限)并且在当前日期及之前没有付款但仍在四个月内,则仍将其视为“有效”。参考contract_id“ADD”和“ADGA”。
但是,如果合同的未付款超过四个月,则将被视为“无效”。参考contract_id“GHDG”。
这是结果的字典:
{'account_id': {0: 12454545, 1: 12454545, 2: 1646468, 3: 5454555, 4: 48654},
'contract_id': {0: 'ADD', 1: 'ADFGG', 2: 'ASDADGAD', 3: 'ADGA', 4: 'GHDG'},
'date_activated': {0: Timestamp('2020-08-24 00:00:00'),
1: Timestamp('2021-02-01 00:00:00'),
2: Timestamp('2020-08-03 00:00:00'),
3: Timestamp('2020-08-10 00:00:00'),
4: Timestamp('2018-10-18 00:00:00')},
'term_months': {0: 11, 1: 12, 2: 7, 3: 8, 4: 6},
'status': {0: 'Active',
1: 'Active',
2: 'Inactive',
3: 'Active',
4: 'Inactive'},
datetime.datetime(2020, 8, 1, 0, 0): {0: 620.984848484848,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 100.0},
datetime.datetime(2020, 9, 1, 0, 0): {0: 620.984848484848,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 100.0},
datetime.datetime(2020, 10, 1, 0, 0): {0: 620.984848484848,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 100.0},
datetime.datetime(2020, 11, 1, 0, 0): {0: 620.984848484848,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 0.0},
datetime.datetime(2020, 12, 1, 0, 0): {0: 0.0,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 0.0},
datetime.datetime(2021, 1, 1, 0, 0): {0: 0.0,
1: 0.0,
2: 1504.69999999999,
3: 528.0,
4: 0.0},
datetime.datetime(2021, 2, 1, 0, 0): {0: 0.0,
1: 687.94,
2: 1504.69999999999,
3: 0.0,
4: 0.0},
datetime.datetime(2021, 3, 1, 0, 0): {0: 0.0,
1: 687.94,
2: 0.0,
3: 0.0,
4: 0.0},
datetime.datetime(2021, 4, 2, 0, 0): {0: 0.0,
1: 687.94,
2: 0.0,
3: 528.0,
4: 0.0}}
【问题讨论】:
-
如果当前日期距离最后一列的日期(从 df.比如如果是 2021 年 7 月 1 日,我应该考虑 4 月 2 日(最后一列)和 2021 年 7 月 1 日之间的日期?
-
根据我目前的数据,它永远不会发生。当前日期始终在可用列中。
-
12454545 在 5 个月未付款后处于活动状态。输出应该是这样的吗?
-
非常抱歉。我的意思是将当前日期设置为“2021 年 3 月 1 日”。这可能让你感到困惑。基于此,12454545 仍然处于活动状态。但是,如果将当前日期设置为“2021 年 4 月 1 日”,它将处于非活动状态。
-
当前日期逻辑不是很清楚。因此,如果 current_date 设置为 2021 年 3 月 1 日,我们将忽略 2021 年 3 月 1 日之后的所有列,是吗?
标签: python pandas dataframe numpy