【问题标题】:Create repetative rows by iterating between dates in two column通过在两列中的日期之间迭代来创建重复行
【发布时间】:2021-11-11 19:04:20
【问题描述】:

我在一个数据框中有三列

  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 行,如图所示。

输入表是:

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

【问题讨论】:

  • 请重新格式化您的数据框。也许你应该使用print(df.tostring(), index=False)
  • 我需要按图片输出
  • 您的输出数据没有意义。其他年份的 3 月 15 日有什么特别之处?为什么没有“15-3-2014 到 31-12-2014”、“1-1-2015 到 31-12-2015”、“1-1-2016 到 31-12-2016”等?为什么 2016 年 1 月 1 日包含在 2015 日历年中?
  • 我已经忽略了
  • 我必须忽略 01-01-2015 之前的所有年份。根据 DoA 中的数据,我的数据框应从 2015 年 1 月 1 日或更多时间开始

标签: python python-3.x pandas python-2.7 python-requests


【解决方案1】:

这就是你想要的。这不是一项艰巨的工作。像大多数类似的任务一样,你只需要一步一步地完成它。 “我在这里知道什么”,“我在这里需要什么信息”?请注意,我已将日期转换为 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

【讨论】:

  • 我不知道你说的“开始日期可以改变很多”是什么意思。
  • 非常感谢蒂姆的指导。
  • 您的代码仅适用于列表,但不适用于数据框。我在 2020 年的结束日期是 17-08-2020,但您的输出在 2020 年 3 月 15 日终止,因此它应该再增加一行,str 日期为 15-03-2020,结束日期为 17-08-2020。我有数千个 ID 的数据框。
  • 我用一个示例数据询问了解决方案,但在完整的数据帧上实施了解决方案。
  • 听着,你必须在这里做一些工作。缺少行的问题是一个单词的修复,我在上面已经修复了,但是您需要负责从我的代码开始并将其更改为读取您的数据框而不是简单的列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多