python-3.x - 根据python中的日期差异扩展数据框
问题描述
我有一个场景如下
场景1:
FromDate ToDate
15-01-2018 15-12-2018
15-12-2018 15-10-2020
...
15-10-2020 15-11-2020
15-11-2020 15-12-2020
15-12-2020 15-01-2021
这里没有从15-01-2018到15-12-2018以及15-12-2018到15-10-2020的延续,所以我想获得如下的上述数据框。
FromDate ToDate
15-01-2018 15-02-2018
15-02-2018 15-03-2018
15-03-2018 15-04-2018
...
15-11-2018 15-12-2018
15-12-2018 15-01-2020
15-01-2020 15-02-2020
15-02-2020 15-03-2020
...
15-09-2020 15-10-2020
15-10-2020 15-11-2020
15-11-2020 15-12-2020
15-12-2020 15-01-2021
有没有办法可以实现这一目标?
场景2:在场景2中,最后一个FromDate是15-12-2020,ToDate是10-01-2021 ,这里一个月的一天不一样。
输入 :
FromDate ToDate
15-01-2018 15-12-2018
15-12-2018 10-10-2020
...
15-10-2020 15-11-2020
15-11-2020 15-12-2020
15-12-2020 10-01-2021
输出 :
FromDate ToDate
15-01-2018 15-02-2018
15-02-2018 15-03-2018
15-03-2018 15-04-2018
...
15-11-2018 15-12-2018
15-12-2018 15-01-2020
15-01-2020 15-02-2020
15-02-2020 15-03-2020
...
15-09-2020 10-10-2020
15-10-2020 15-11-2020
15-11-2020 15-12-2020
15-12-2020 10-01-2021
解决方案
- FromDate生成一个列表
date_range()
- 展开它
explode()
- 计算至今
import datetime as dt
df = pd.read_csv(io.StringIO("""FromDate ToDate
15-01-2018 15-12-2018
15-12-2018 15-10-2020
15-10-2020 15-11-2020
15-11-2020 15-12-2020
15-12-2020 10-01-2021"""), sep="\s+")
df.FromDate = pd.to_datetime(df.FromDate)
df.ToDate = pd.to_datetime(df.ToDate)
(df.assign(FromDate=df.apply(lambda r: pd.date_range(dt.date(r.FromDate.year, r.FromDate.month, 1),
dt.date(r.ToDate.year, r.ToDate.month, 1) - pd.Timedelta(days=1),
freq="MS") + pd.Timedelta(days=r.FromDate.day-1), axis=1))
.explode("FromDate")
.assign(
ToDate=lambda dfa: np.where((dfa.ToDate-dfa.FromDate).gt(dt.timedelta(days=35)),
dfa.FromDate + pd.DateOffset(months=1),
dfa.ToDate))
)