【问题标题】:Add new rows to pandas dataframe with reference with other Row?参考其他行向熊猫数据框添加新行?
【发布时间】:2020-07-10 15:29:12
【问题描述】:

df:

End_Dt_Id Start_Date     End_Date
18AUG19   12-08-2019    18-08-2019  -- date format DD/MM/YYYY
25AUG19   19-08-2019    25-08-2019
01SEP19   26-08-2019    01-09-2019
08SEP19   02-09-2019    08-09-2019
15SEP19   09-09-2019    15-09-2019
22SEP19   16-09-2019    22-09-2019
12SEP19   23-09-2019    29-09-2019

我需要在我的数据框中再增加 4 周,这将取决于上周在我的 df 中, 例如,由于 max(End_Date),上周将是这一行“29SEP19 23-09-2019 29-09-2019”,然后我需要再添加四个星期,如输出所示。

df_output:

End_Dt_Id Start_Date     End_Date
18AUG19   12-08-2019    18-08-2019  -- date format DD/MM/YYYY
25AUG19   19-08-2019    25-08-2019
01SEP19   26-08-2019    01-09-2019
08SEP19   02-09-2019    08-09-2019
15SEP19   09-09-2019    15-09-2019
22SEP19   16-09-2019    22-09-2019
29SEP19   23-09-2019    29-09-2019
05OCT19   30-09-2019    05-10-2019
12OCT19   06-10-2019    12-10-2019
19OCT19   13-10-2019    19-10-2019
26OCT19   20-10-2019    26-10-2019

【问题讨论】:

  • 最大结束日期不是22-09-2019吗?或者您只是想在最后一行添加 4 行?
  • 为什么你的日期倒退了,这里的逻辑是什么?
  • @Datanovice 对不起,我已经更正了问题,请查看。

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


【解决方案1】:

我不确定我是否理解其中的逻辑,但这提供了您正在寻找的输出:

last_row = df.sort_values('End_Date')[-1:]
new_rows = []
start_date = last_row['Start_Date'].iloc[0]
end_date = last_row['End_Date'].iloc[0]
for i in range(1,5):

    start_date = end_date + dt.timedelta(days=1)
    end_date = end_date + dt.timedelta(days=7)
    end_dt_id = dt.datetime.strftime(end_date, '%d%b%y').upper()
    new_rows.append([end_dt_id,start_date, end_date])
    
df = pd.concat([
    df, 
    pd.DataFrame(new_rows, columns=['End_Dt_Id', 'Start_Date', 'End_Date'])
])
for col in ['Start_Date', 'End_Date']:
    df[col] = pd.to_datetime(df[col]).dt.strftime('%d-%m-%Y')

返回:

End_Dt_Id  Start_Date    End_Date
  18AUG19  12-08-2019  18-08-2019
  25AUG19  19-08-2019  25-08-2019
  01SEP19  26-08-2019  01-09-2019
  08SEP19  02-09-2019  08-09-2019
  15SEP19  09-09-2019  15-09-2019
  22SEP19  16-09-2019  22-09-2019
  12SEP19  23-09-2019  12-09-2019
  19SEP19  13-09-2019  19-09-2019
  26SEP19  20-09-2019  26-09-2019
  03OCT19  27-09-2019  03-10-2019
  10OCT19  04-10-2019  10-10-2019

【讨论】:

  • 对不起,我已经更正了问题,请查看。
  • 我不明白逻辑..第一个数据帧中的值增加 7.. 例如,15-09-2019 - > 22-09-2019.. 但29-09-201905-10-2019 之间只有 6 天
  • 实际上我得到了逻辑部分,但有一点需要担心, df 并不总是将最后一行包含为 max(date) row ,因此 df[-1] 并不总是有效。所以最好根据日期获取最后一行..
  • 好的,我修改了答案以按日期抓取最后一行
  • 我有一个疑问,开始日期和结束日期是如何变化的,因为你写了 start_date = end_date + dt.timedelta(days=1) 所以如果我的 last_row[' 应该给出 30-06-2019 end_date'] = 29-06-2019 第一次迭代。对于自结束日期以来的第二次迭代是指 last_row,它应该再次给出 30-06-2019 但它会给你 07-07-2019 如何???
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 2023-03-17
  • 2017-02-11
  • 2019-11-12
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多