通过在两列中的日期之间迭代来创建重复行
Create repetative rows by iterating between dates in two column
我在一个数据框中有三列
- ID - A001
- DoA - 15-03-2014 - 录取日期
- 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
我在一个数据框中有三列
- ID - A001
- DoA - 15-03-2014 - 录取日期
- 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