python - 根据时间戳合并 pandas 数据帧
问题描述
有两个这样的数据框(示例)
df1
Data Value
0 2020-01-31 10:30:00 3
1 2020-01-31 11:30:00 4
2 2020-01-31 12:30:00 19
3 2020-01-31 13:30:00 22
4 2020-01-31 14:30:00 4
5 2020-01-31 15:30:00 5
6 2020-01-31 15:30:00 6
7 2020-01-31 16:30:00 7
8 2020-01-31 17:30:00 9
9 2020-01-31 18:30:00 7
10 2020-01-31 19:30:00 8
df2
DSTART DEnd Condition
0 2020-01-31 11:30:00 2020-01-31 12:30:00 BAD
1 2020-01-31 15:30:00 2020-01-31 16:30:00 ERROR
然后,我想加入 df1 和 df2,但我不知道该怎么做,因为在第二个 df 中我只有开始和结束时间。如何根据第二个df的数据将条件放在第一个df上?
这就是我要的
Data Value Condition
0 2020-01-31 10:30:00 3 OK
1 2020-01-31 11:30:00 4 BAD
2 2020-01-31 12:30:00 19 BAD
3 2020-01-31 13:30:00 22 BAD
4 2020-01-31 14:30:00 4 OK
5 2020-01-31 15:30:00 5 ERROR
6 2020-01-31 15:30:00 6 ERROR
7 2020-01-31 16:30:00 7 OK
8 2020-01-31 17:30:00 9 OK
9 2020-01-31 18:30:00 7 OK
10 2020-01-31 19:30:00 8 OK
解决方案
尝试pd.merge_asof
:
# make sure that `Data`, `DSTART`, `DEnd` are datetime type
# use `pd.to_datetime` if needed
tmp = pd.merge_asof(df1,df2, left_on='Data', right_on='DSTART')
df1['Condition'] = tmp['Condition'].where(tmp['Data'] <= tmp['DEnd'], 'OK')
输出:
Data Value Condition
0 2020-01-31 10:30:00 3 OK
1 2020-01-31 11:30:00 4 BAD
2 2020-01-31 12:30:00 19 BAD
3 2020-01-31 13:30:00 22 OK
4 2020-01-31 14:30:00 4 OK
5 2020-01-31 15:30:00 5 ERROR
6 2020-01-31 15:30:00 6 ERROR
7 2020-01-31 16:30:00 7 ERROR
8 2020-01-31 17:30:00 9 OK
9 2020-01-31 18:30:00 7 OK
10 2020-01-31 19:30:00 8 OK
推荐阅读
- javascript - 在 JavaScript 中使用 AlpineJS $persist 而不是 HTML
- python - 如何在 Python 中比较两个 CSV 文件?
- android - 在 exoplayer 中手动控制视频质量
- facebook - Facebook 赞助商消息出价金额货币转换
- sql - QuestDB 列定义检查约束,NOT NULL 和 CHECK(condition/s)
- javascript - 如何防止重新渲染没有道具的子组件?
- angular - 将纯文本传递给 Angular 组件,在 typescript 级别访问 ng-content 值
- arrays - 选择列值匹配的第一行的值
- apex-trigger - 多对多关系的触发代码
- azure - 如何使用在 VM 中创建的本地用户连接到 Azure Windows Server VM