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),一个和金额字段保持不变。除了有这么多列之外,我还需要行。希望这能澄清问题。非常感谢你的帮助!非常感谢。