Python 3.x 滚落轮廓

Python 3.x 滚落轮廓,python-3.x,pandas,Python 3.x,Pandas,我有一个熊猫数据框,看起来像: import pandas as pd import datetime as dt df= pd.DataFrame({'date':['2017-12-31','2017-12-31'],'type':['Asset','Asset'],'Amount':[365,45],'Maturity Date':['2019-01-02','2018-07-02']}) df 我想创建一个“滚动”档案,显示前三个月和未来五个季度。我已经能够使用以下代码完成此操作:

我有一个熊猫数据框,看起来像:

import pandas as pd
import datetime as dt

df= pd.DataFrame({'date':['2017-12-31','2017-12-31'],'type':['Asset','Asset'],'Amount':[365,45],'Maturity Date':['2019-01-02','2018-07-02']})
df
我想创建一个“滚动”档案,显示前三个月和未来五个季度。我已经能够使用以下代码完成此操作:

#First Month
df['2018-01-31']=0
df.loc[df['Maturity Date']>'2018-01-31','2018-01-31']=df['Amount']

#Second Month
df['2018-02-28']=0
df.loc[df['Maturity Date']>'2018-02-28','2018-02-28']=df['Amount']

#Third Month
df['2018-03-31']=0
df.loc[df['Maturity Date']>'2018-03-31','2018-03-31']=df['Amount']

#First Quarter
df['2018-06-30']=0
df.loc[df['Maturity Date']>'2018-06-30','2018-06-30']=df['Amount']

#Second Quarter
df['2018-09-30']=0
df.loc[df['Maturity Date']>'2018-09-30','2018-09-30']=df['Amount']
我想知道是否有更有效的方法来实现这一点?具体来说,我想要一种方法:

  • 不手动输入前三个月和随后的季度
  • 避免在每个月和每个季度重复类似代码
  • 您可以使用:

    #convert to datetime if necessary
    df['Maturity Date'] = pd.to_datetime(df['Maturity Date'])
    
    d = '2018-01-31'
    #generate first month and next quarters
    c1 = pd.date_range(d, periods=3, freq='M')
    c2 =  pd.date_range(c1[-1], periods=3, freq='Q')
    #join together
    c = c1.union(c2[1:])
    
    #compare column with joined datetimes
    m = df['Maturity Date'].values[:, None] > c.values
    #get values by boolean mask
    b = np.where(m, df['Amount'].values[:, None], 0)
    #join output df to original, format columns with strftime
    df1 = df.join(pd.DataFrame(b, columns=c.strftime('%Y-%m-%d')))
    print (df1)
       Amount Maturity Date        date   type  2018-01-31  2018-02-28  \
    0     365    2019-01-02  2017-12-31  Asset         365         365   
    1      45    2018-07-02  2017-12-31  Asset          45          45   
    
       2018-03-31  2018-06-30  2018-09-30  
    0         365         365         365  
    1          45          45           0  
    

    你能解释更多的
    和随后的季度吗?我尝试在上个月之前动态生成它,但我得到的是第一季度和第二季度,而不是第二季度和第三季度。因此,我的解决方案发生了变化——产生了3个季度,第一个季度被
    c2[1:][/code>删除。这是您需要的吗?我看到您创建了新问题,所以我的解决方案不起作用?您好,您的解决方案很好,但这是一个稍微不同的问题。在上面的问题中,每个新日期都是一个单独的列。但是,在新问题中,每个新日期都是单独的一行。我尝试使用melt,但失败了。所以需要带日期时间的melt列吗?我不需要为每个数据点单独设置一列。因此,只有一个额外的列包含日期(2018-01-3112018-02-282018-03-31),一个和金额字段保持不变。除了有这么多列之外,我还需要行。希望这能澄清问题。非常感谢你的帮助!非常感谢。