通过在两列中的日期之间迭代来创建重复行

Create repetative rows by iterating between dates in two column

我在一个数据框中有三列

  1. ID - A001
  2. DoA - 15-03-2014 - 录取日期
  3. DoL - 17-08-2020 - 离开日期

创建三个新列:

Cal_Yr - Calender Year
Str_Date - Start of Date
End_Date - End of Date

如果入学年份小于2015年则

Str_Date = 01-01-2015 else DoA
End_Date = 15-03-2015

我将一年分为两部分...周年纪念日之前的一部分(当年的开始 dd-mm)和周年纪念日之后的另一部分,以便我可以找到两部分的重量...但是01-01-2015 之前的日期应重新评估为 01-01-2015

我必须设计一个循环来创建重复的 12 行,如图所示。

输入table是:

ID DoA status DoL Duration(years) fee amt
A23 02-Jan-16 DH 18-Aug-18 2 2345
B23 01-Mar-09 IS 31-Dec-20 11 1000
C23 16-Sep-12 SU 12-Jul-19 7 14565
D23 01-Jun-20 LA 07-Sep-20 0 123
E23 15-Sep-16 IS 31-Dec-20 4 6790
F23 01-Jan-19 IS 31-Dec-20 1 7272

这就是你想要的。这不是一项艰巨的工作;像大多数类似的任务一样,您只需要一步一步来。 “我在这里知道什么”,“我在这里需要什么信息”?请注意,我已将日期转换为 datetime.date 对象,假设您希望根据日期进行一些分析。

import pandas as pd
import datetime

data = [
    [ "A001", "15-03-2014", "17-08-2020" ],
    [ "A002", "01-06-2018", "01-06-2020" ]
]

rows = []
for id, stdate, endate in data:
    s = stdate.split('-')
    startdate = datetime.date(int(s[2]),int(s[1]),int(s[0]))
    s = endate.split('-')
    enddate = datetime.date(int(s[2]),int(s[1]),int(s[0]))
    for year in range(startdate.year, enddate.year + 1 ):
        start1 = datetime.date(year,1,1)
        anniv = datetime.date(year,startdate.month,startdate.day)
        end1 = datetime.date(year,12,31)
        
        if year != startdate.year:
            rows.append( [id, year, start1, anniv] )
            if anniv == enddate:
                break
        if year != enddate.year:
            rows.append( [id, year, anniv, end1] )
        elif anniv < enddate:
            rows.append( [id, year, anniv, enddate] )

df = pd.DataFrame( rows, columns=["ID", "Cal_Yr", "Str_date", "End_date"] )
print( df )

输出:

      ID  Cal_Yr    Str_date    End_date
0   A001    2014  2014-03-15  2014-12-31
1   A001    2015  2015-01-01  2015-03-15
2   A001    2015  2015-03-15  2015-12-31
3   A001    2016  2016-01-01  2016-03-15
4   A001    2016  2016-03-15  2016-12-31
5   A001    2017  2017-01-01  2017-03-15
6   A001    2017  2017-03-15  2017-12-31
7   A001    2018  2018-01-01  2018-03-15
8   A001    2018  2018-03-15  2018-12-31
9   A001    2019  2019-01-01  2019-03-15
10  A001    2019  2019-03-15  2019-12-31
11  A001    2020  2020-01-01  2020-03-15
12  A001    2020  2020-03-15  2020-08-17
13  A002    2018  2018-06-01  2018-12-31
14  A002    2019  2019-01-01  2019-06-01
15  A002    2019  2019-06-01  2019-12-31
16  A002    2020  2020-01-01  2020-06-01