首页 > 解决方案 > 根据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-201815-12-2018以及15-12-201815-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

标签: python-3.xpandaspython-2.7dataframenumpy

解决方案


  • 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))
)

推荐阅读