pandas日期列的多个日期范围

qqq*_*www 5 python datetime date pandas

目前的df:

ID  Date
11  3/19/2018
22  1/5/2018
33  2/12/2018
..  ..
Run Code Online (Sandbox Code Playgroud)

我有ID和日期的df.ID在原始df中是唯一的.我想基于日期创建一个新的df.每个ID都有一个最大日期,我想使用该日期并返回4天(每个ID 5行)有数千个ID.

期望获得:

ID  Date
11  3/15/2018
11  3/16/2018
11  3/17/2018
11  3/18/2018
11  3/19/2018
22  1/1/2018
22  1/2/2018
22  1/3/2018
22  1/4/2018
22  1/5/2018
33  2/8/2018
33  2/9/2018
33  2/10/2018
33  2/11/2018
33  2/12/2018
…   …
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,我认为使用date_range可能是正确的方向,但我一直得到错误.

pd.date_range

def date_list(row):
    list = pd.date_range(row["Date"], periods=5)
    return list

df["Date_list"] = df.apply(date_list, axis = "columns")
Run Code Online (Sandbox Code Playgroud)

Hal*_*Ali 3

group by ID,选择列Date,并为每个组生成一系列截至最大日期的五天。

我没有编写很长的 lambda,而是编写了一个辅助函数。

def drange(x): 
    e = x.max()
    s = e-pd.Timedelta(days=4)
    return pd.Series(pd.date_range(s,e))

res = df.groupby('ID').Date.apply(drange)
Run Code Online (Sandbox Code Playgroud)

然后从生成的多重索引中删除无关级别,我们就得到了所需的输出

res.reset_index(level=0).reset_index(drop=True)
# outputs:

    ID       Date
0   11 2018-03-15
1   11 2018-03-16
2   11 2018-03-17
3   11 2018-03-18
4   11 2018-03-19
5   22 2018-01-01
6   22 2018-01-02
7   22 2018-01-03
8   22 2018-01-04
9   22 2018-01-05
10  33 2018-02-08
11  33 2018-02-09
12  33 2018-02-10
13  33 2018-02-11
14  33 2018-02-12
Run Code Online (Sandbox Code Playgroud)

紧凑型替代方案

# Help function to return Serie with daterange
func = lambda x: pd.date_range(x.iloc[0]-pd.Timedelta(days=4), x.iloc[0]).to_series()

res = df.groupby('ID').Date.apply(func).reset_index().drop('level_1',1)
Run Code Online (Sandbox Code Playgroud)