【发布时间】:2021-12-30 00:35:33
【问题描述】:
我有一个数据框(df)如下:
Customer Date_Begin Date_End Product
0 1 2017-01-01 2020-01-01 UsagePeriod
1 1 2017-01-02 2018-01-02 Token
2 1 2017-01-06 2018-01-06 Token
3 1 2018-12-01 2019-12-01 Token
4 1 2019-06-01 2020-06-01 Token
5 1 2019-12-21 2022-12-21 UsagePeriod
6 1 2020-01-31 2021-01-31 Token
7 1 2021-06-30 2022-06-30 Token
8 1 2021-09-30 2022-09-30 Token
9 2 2019-06-01 2022-06-01 UsagePeriod
10 2 2019-06-01 2020-06-01 Token
11 3 2019-06-01 2022-06-01 UsagePeriod
12 3 2019-06-01 2020-06-01 Token
13 3 2020-06-01 2021-06-01 Token
14 4 2017-01-01 2020-01-01 UsagePeriod
15 4 2017-02-15 2018-02-15 Token
16 4 2019-12-15 2020-12-15 Token
要达到所需的输出数据帧,需要应用一些规则:
- 每个客户都有一个可以购买代币的 UsagePeriod。通常令牌会在一年内(最多)过期,而 UsagePeriod 总是从 Date_Begin 开始 3 年。 Date_End 列给出了预期的到期日期。
- 客户不会购买新的令牌,除非他的令牌已过期。这意味着如果他(她)正在购买一个新的代币,那么他(她)已经用完了该代币。假设客户在前一个令牌到期时购买了新令牌,我想打开一个包含所有到期日期的附加列。
- 令牌只能在客户定义的 UsagePeriod 中使用,除非客户购买新的 Usage Period。 我想要达到的输出数据框是:
Customer Date_Begin Date_End Product Expiry
0 1 2017-01-01 2020-01-01 UsagePeriod 2020-01-01
1 1 2017-01-02 2018-01-02 Token 2017-01-06
2 1 2017-01-06 2018-01-06 Token 2018-01-06
3 1 2018-12-01 2019-12-01 Token 2019-06-01
4 1 2019-06-01 2020-06-01 Token 2019-12-21
5 1 2019-12-21 2022-12-21 UsagePeriod 2022-12-21
6 1 2020-01-31 2021-01-31 Token 2021-01-31
7 1 2021-06-30 2022-06-30 Token 2021-09-30
8 1 2021-09-30 2022-09-30 Token 2022-09-30
9 2 2019-06-01 2022-06-01 UsagePeriod 2022-06-01
10 2 2019-06-01 2020-06-01 Token 2020-06-01
11 3 2019-06-01 2022-06-01 UsagePeriod 2022-06-01
12 3 2019-06-01 2020-06-01 Token 2020-06-01
13 3 2020-06-01 2021-06-01 Token 2021-06-01
14 4 2017-01-01 2020-01-01 UsagePeriod 2020-01-01
15 4 2017-02-15 2018-02-15 Token 2018-02-15
16 4 2019-12-15 2020-12-15 Token 2020-01-01
我目前拥有的代码是:
def myFunc(df):
for i in range(0,len(df)-1): #loop through each row of dataframe
if df.Product.loc[i] == "UsagePeriod": #When product equals "UsagePeriod"
df['expiricy'].loc[i] = df['Date_Begin'].loc[i] + pd.offsets.DateOffset(years=3); #update new column
elif df.Product.loc[i] == "Token": #When product equals "Token"
if df.Customer.loc[i] == df.Customer.loc[i+1]: #customer changed?
if abs(df.Date_Begin.loc[i+1]-df.Date_Begin.loc[i])>= pd.Timedelta(364, 'd'): #has year increased by more than 1(year)? product = product
df['expiricy'].loc[i] = df['Date_Begin'].loc[i] + pd.offsets.DateOffset(years=1); #update new column
elif abs(df.Date_Begin.loc[i+1]-df.Date_Begin.loc[i]) < pd.Timedelta(364, 'd'): #When less than a year?
df['expiricy'].loc[i] = df['Date_Begin'].loc[i+1];
我正在努力在 UsagePeriod 中定义令牌结束期。任何帮助将不胜感激。
【问题讨论】:
-
欢迎来到 SO - 请使用 tour 并阅读 How to Ask 以改进,edit 并格式化您的问题。谢谢
-
你想要下一个token的Date_begin作为到期日吗??
-
根据客户,如果令牌和下一个令牌之间的间隔小于一年,则应将其更新为下一个令牌的开始日期。如果超过一年,则应将其更新为令牌的结束日期。但是,如果 End_date 超过该客户的 UsagePeriod 的 End_date,则无论到期日期应该保留/结束在客户的定义 UsagePeriod 中
标签: python pandas dataframe loops date