将具有日期字段的一行拆分为具有指定季度日期的多行

问题描述 投票:0回答:1

我有一个包含开始日期和结束日期的数据框。 我想将该行拆分为多行,日期范围在预定义的季度内。 预先定义的季度(无论年份)是: 第一季度-四月-六月 第二季度-7月-9月 第三季度-10 月-12 月 Q4-1月-3月

该行必须在开始日期和结束日期之间拆分,但按预定义的季度月份拆分。

输入数据框:

Pol_num 开始日期 结束日期
p1 2019-05-12 2020-05-11
p2 2018-11-28 2019-07-29

我想要的输出如下:

Pol_num 季度开始日期 季度结束日期 四分之一
p1 2019-05-12 2019-06-30 Q1
p1 2019-07-01 2019-09-30 Q2
p1 2019-10-01 2019-12-31 Q3
p1 2020-01-01 2020-03-31 Q4
p1 2020-04-01 2020-05-11 Q1
p2 2018-11-28 2018-12-31 Q3
p2 2019-01-01 2019-03-31 Q4
p2 2019-04-01 2019-06-30 Q1
p2 2019-07-01 2019-07-29 Q2

有人可以帮忙吗?

python pandas datetime calendar date-range
1个回答
0
投票

一种选择可能是使用

date_range
生成所有日期,然后生成
explode
,然后对输出进行后处理以计算 Quarter_start_date 和 Quarter,并修复 Quarter_end_date:

out = (
 df.assign(Quarter_end_date=[pd.date_range(start, end, freq='Q')
                             for start, end in zip(df['start_date'],
                                                   df['end_date'])])
   .explode('Quarter_end_date')
   .assign(Quarter_start_date=lambda d: d['Quarter_end_date']
           .sub(pd.Timedelta('1d'))
           .where(d.index.duplicated(), d['start_date']),
           Quarter_end_date=lambda d: d['Quarter_end_date']
           .where(d.index.duplicated(keep='last'), d['end_date']),
           Quarter=lambda d: 'Q'+d['Quarter_end_date'].dt.quarter.astype(str)
          )
    [['Pol_num', 'Quarter_start_date', 'Quarter_end_date', 'Quarter']]
)

输出:

  Pol_num Quarter_start_date Quarter_end_date Quarter
0      p1         2019-05-12       2019-06-30      Q2
0      p1         2019-09-29       2019-09-30      Q3
0      p1         2019-12-30       2019-12-31      Q4
0      p1         2020-03-30       2020-05-11      Q2
1      p2         2018-11-28       2018-12-31      Q4
1      p2         2019-03-30       2019-03-31      Q1
1      p2         2019-06-29       2019-07-29      Q3
© www.soinside.com 2019 - 2024. All rights reserved.