python - 比较列和添加新列时,日期计算中的方法
问题描述
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
请告诉我是否有任何难以理解的部分。
解决方案
merge_asof
与direction='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
推荐阅读
- python - Pandas:如何仅删除列末尾的最后一个连字符
- google-forms - 如何根据其他用户过去的回复使 Google 表单自动填充?
- c - 我知道一个地址,但我应该如何判断在哪个部分?使用C的全局区域或堆区域或堆栈区域
- json - 如何解决“手势 RangeError(索引)捕获的异常:无效值:有效值范围为空:0”
- c++ - 什么会使多边形算法中的点仅在正向和反向运行时才能正常工作?
- php - PHP:如何使用键->值对每两个分隔符将一个字符串分解为一个数组
- kubernetes - 将 GKE 集群拆除为“全新”状态而不删除它?
- scala - Spark——自定义reduce函数保存到磁盘然后上传到s3
- javascript - XMLHttpRequest 返回事件对象而不是实际数据
- fortran - Fortran 将未知大小的文件读入数组