<ul>
<li>为开始日期生成日期范围</li>
<li><code>explode()</code>它可以生成所需的行</li>
<li>计算<strong>结束</strong>和<strong>周年</strong></li>
</ul>
<pre><code>df = pd.read_csv(io.StringIO("""index NUM_contrat start end anniversary quantity
0 144 2008-02-11 2011-03-28 2009-02-11 550
1 144 2011-03-28 2011-09-19 2012-02-11 550
2 150 2011-09-19 2012-02-10 2012-09-19 900
3 150 2012-02-10 2013-02-10 2013-09-19 900"""), sep="\t", index_col=0)
# cleanup - make sure dates are dates
df.start = pd.to_datetime(df.start)
df.end = pd.to_datetime(df.end)
df.anniversary = pd.to_datetime(df.anniversary)
df
# # generate a date range for start, based on end date
df2 = (df.assign(start=df.apply(lambda r: pd.date_range(r.start,
periods=((r.end.year+1)-r.start.year),
freq=pd.DateOffset(years=1)), axis=1))
# explode the start dates
.explode("start")
# calc end and anivversary dates
.assign(end=lambda dfa: np.where(dfa.start.dt.year==dfa.end.dt.year,dfa.end, dfa.start+pd.DateOffset(years=1)),
anniversary=lambda dfa: dfa.start+pd.DateOffset(years=1))
# anniversary is always the one from the first instance of the contract
.assign(anniversary=lambda dfa: dfa.groupby(["NUM_contrat",dfa.start.dt.year])["anniversary"].transform("first"))
)
df2
</code></pre>
<h3>输出</h3>
<div class="s-table-container">
^{tb1}$
</div>