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'])
这给你:
我想根据以下规则为给定的 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'])
这给你: