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)
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)
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |