Skip to main content
 首页 » 编程设计

python之Pandas之使用 daterange 扩展数据框

2025年05月04日13傻小

我有以下数据框:

 name    from       amount   days 
 A       7/31/18    200      1 
 B       7/31/18    300      1 
 C       7/30/18    200      1 
 D       7/27/18    100      3 
 ...... 
 G       7/17/18    50       1 
 H       7/13/18    150      4 

我想将它扩展到这个,其中天数不等于 1:

 name    from       amount   days 
 A       7/31/18    200      1 
 B       7/31/18    300      1 
 C       7/30/18    200      1 
 D       7/29/18    100      3 
 D       7/28/18    100      3 
 D       7/27/18    100      3 
 ...... 
 G       7/17/18    50       1 
 H       7/16/18    150      4 
 H       7/15/18    150      4 
 H       7/14/18    150      4 
 H       7/13/18    150      4 

如果可能的话,我还想添加一个可以区分原始数据和扩展数据的列(因为我最终需要过滤一些日期):

 name    from       amount   days   original 
 A       7/31/18    200      1      1 
 B       7/31/18    300      1      1 
 C       7/30/18    200      1      1 
 D       7/29/18    100      3      0 
 D       7/28/18    100      3      0 
 D       7/27/18    100      3      1 
 ...... 
 G       7/17/18    50       1      1 
 H       7/16/18    150      4      0 
 H       7/15/18    150      4      0 
 H       7/14/18    150      4      0 
 H       7/13/18    150      4      1 

编辑:阐明扩展:Days 会告诉您它需要扩展到多少行。或者,您可以使用原始值上方的日期作为边界(条目 7/27 where days=3 将停止在上面的日期为 7/30 的值处。数据有约束以确保它永远不会重叠)。

请您参考如下方法:

大约两步创建dataframe(reindex),调整值(duplicated)

newdf=df.reindex(df.index.repeat(df.days)) # create the df using reindex 
adddate=pd.Series(np.concatenate(df.days.apply(np.arange).values),index=newdf.index)# create the timedelta to add  
newdf['from']=pd.to_datetime(newdf['from'])+pd.to_timedelta(adddate,unit='d')# assign the value  
newdf['original']=(~newdf.index.duplicated()).astype(int) 
newdf 
Out[240]:  
  name       from  amount  days  original 
0    A 2018-07-31     200     1         1 
1    B 2018-07-31     300     1         1 
2    C 2018-07-30     200     1         1 
3    D 2018-07-27     100     3         1 
3    D 2018-07-28     100     3         0 
3    D 2018-07-29     100     3         0