首页 > 解决方案 > 比较列和添加新列时,日期计算中的方法

问题描述

df1
Name  date
A     2019-01-24
A     2019-02-13
B     2018-05-12
B     2019-07-21
C     2016-04-24
C     2017-09-11
D     2020-11-24
df2
Name  date2        value
A     2019-01-24   1
A     2019-02-14   2
B     2018-05-13   3
B     2019-07-20   1
C     2016-04-25   2
C     2017-09-11   3

我想比较df1的名称和日期和df2的名称和日期2,如果匹配,则将值添加到df1的新列中。

它运作良好, 在比较不同长度的 2 个数据帧中的值后添加列

我想做的更多是在比较日期和日期2时通过将日期2匹配到日期、日期+1天来增加价值。

例如,

case1. matching True : date - 2019-12-30 : date2 - 2019-12-30
case2. matching True : date - 2019-12-29 : date2 - 2019-12-30
case3. matching False : date - 2019-12-30 : date2 - 2019-12-29

在case1和case2中,我想在df1处添加一个值

所以输出我想要的(应用上面的逻辑)

df1
Name  date       value
A     2019-01-24 1
A     2019-02-13 2
B     2018-05-12 3
B     2019-07-21 NaN
C     2016-04-24 2
C     2017-09-11 3
D     2020-11-24 NaN

请告诉我是否有任何难以理解的部分。

标签: pythonpandasnumpy

解决方案


merge_asofdirection='forward'tolerance=pd.Timedelta(1, 'day')参数一起使用:

df1['date'] = pd.to_datetime(df1['date'])
df2['date2'] = pd.to_datetime(df2['date2'])

df = pd.merge_asof(df1.sort_values('date'), 
                   df2.rename(columns={'date2':'date'}).sort_values('date'), 
                   on='date', 
                   by='Name', 
                   direction='forward',
                   tolerance=pd.Timedelta(1, 'day')).sort_values(['Name','date'])
print (df)
  Name       date  value
3    A 2019-01-24    1.0
4    A 2019-02-13    2.0
2    B 2018-05-12    3.0
5    B 2019-07-21    NaN
0    C 2016-04-24    2.0
1    C 2017-09-11    3.0
6    D 2020-11-24    NaN

推荐阅读