我有一个包含开始日期和结束日期的数据框。 我想将该行拆分为多行,日期范围在预定义的季度内。 预先定义的季度(无论年份)是: 第一季度-四月-六月 第二季度-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 |
有人可以帮忙吗?
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