Pandas计算月差向量

Pandas calculating month difference vector

我想根据以下规则为给定的 df 计算 月差向量 :

Date1       Date2      
12/31/2017  1/1/2018    
12/31/2017  2/1/2018       
12/31/2017  1/15/2018     

逻辑如下:

d1 列:(日期 1+ 1 个月)- 日期 2

d2 列:(日期 1+ 2 个月)- 日期 2

d3 列:(日期 1+ 3 个月)- 日期 2 依此类推...

输出将是:

Date1       Date2       d1    d2   d3  ... d10
12/31/2017  1/1/2018    0     1    2   ... 9
12/31/2017  2/1/2018    -1    0    1   ... 8
12/31/2017  1/15/2018   0     1    2   ... 9

最好的方法是什么,而不是每次都手动拒绝每个 d1、d2、d3、...d10?

非常感谢!

这是您需要的吗?(PS:您可以将 4 更改为 10 将返回您需要的)

#df.Date1=pd.to_datetime(df.Date1)
#df.Date2=pd.to_datetime(df.Date2)

d=dict(zip(np.arange(1,4).astype(str),((df.Date1.dt.to_period('M')-df.Date2.dt.to_period('M')).values[:,None]+np.arange(1,4)).T.tolist()))
df=df.assign(**d)
df
Out[1231]: 
       Date1      Date2  1  2  3
0 2017-12-31 2018-01-01  0  1  2
1 2017-12-31 2018-02-01 -1  0  1
2 2017-12-31 2018-01-15  0  1  2

我会推荐concat

v=pd.DataFrame((df.Date1.dt.to_period('M')-df.Date2.dt.to_period('M')).values[:,None]+np.arange(1,4),columns=np.arange(1,4).astype(str)).add_prefix('d')

pd.concat([df,v],1)
Out[1238]: 
       Date1      Date2  d1 d2 d3
0 2017-12-31 2018-01-01   0  1  2
1 2017-12-31 2018-02-01  -1  0  1
2 2017-12-31 2018-01-15   0  1  2

这是一个以天为单位的答案,因为您没有指定您希望如何舍入您的月份。

from dateutil.relativedelta import relativedelta
for i in range(1,11):
    df["d{}".format(i)] = (df['Date1'].apply(lambda x: x + relativedelta(months=+i)) - df['Date2'])

这给你: