python - 基于阈值和时间戳对 Pandas 进行切片前后
问题描述
我有一个如下所示的数据框:
Timestamp (Index) Status value
2017-01-01 12:01:00 OPEN 83
2017-01-01 12:02:00 OPEN 82
2017-01-01 12:03:00 OPEN 87
2017-01-01 12:04:00 CLOSE 82
2017-01-01 12:05:00 CLOSE 81
2017-01-01 12:06:00 CLOSE 81
2017-01-01 12:07:00 CLOSE 81
2017-01-01 12:08:00 CLOSE 81
2017-01-01 12:09:00 CLOSE 81
2017-01-01 12:10:00 CLOSE 81
2017-01-01 12:11:00 CLOSE 81
2017-01-01 12:12:00 OPEN 81
2017-01-01 12:13:00 OPEN 81
2017-01-01 12:14:00 OPEN 81
2017-01-01 12:15:00 OPEN 81
2017-01-01 12:16:00 CLEAR 34
2017-01-01 12:17:00 CLOSE 23
2017-01-01 12:18:00 CLOSE 23
2017-01-01 12:19:00 CLOSE 75
2017-01-01 12:20:00 CLOSE 65
2017-01-01 12:21:00 CLOSE 72
2017-01-01 12:22:00 CLOSE 76
2017-01-01 12:23:00 CLOSE 77
2017-01-01 12:24:00 OPEN 87
2017-01-01 12:25:00 OPEN 87
2017-01-01 12:26:00 OPEN 87
2017-01-01 12:27:00 OPEN 87
2017-01-01 12:28:00 OPEN 87
2017-01-01 12:29:00 CLOSE 75
2017-01-01 12:30:00 CLOSE 75
2017-01-01 12:31:00 CLOSE 75
如果连续 CLOSE 值中的第一个低于 70,我想删除之前的 OPEN 块和值低于 70 的 CLOSE 块。它应该如下所示:
Timestamp (Index) Status value
2017-01-01 12:01:00 OPEN 83
2017-01-01 12:02:00 OPEN 82
2017-01-01 12:03:00 OPEN 87
2017-01-01 12:04:00 CLOSE 82
2017-01-01 12:05:00 CLOSE 81
2017-01-01 12:06:00 CLOSE 81
2017-01-01 12:07:00 CLOSE 81
2017-01-01 12:08:00 CLOSE 81
2017-01-01 12:09:00 CLOSE 81
2017-01-01 12:10:00 CLOSE 81
2017-01-01 12:11:00 CLOSE 81
2017-01-01 12:24:00 OPEN 87
2017-01-01 12:25:00 OPEN 87
2017-01-01 12:26:00 OPEN 87
2017-01-01 12:27:00 OPEN 87
2017-01-01 12:28:00 OPEN 87
2017-01-01 12:29:00 CLOSE 75
2017-01-01 12:30:00 CLOSE 75
2017-01-01 12:31:00 CLOSE 75
关于如何获取相关时间戳以删除这些期间的任何想法?
解决方案
尝试:
df[df.groupby((df.status.shift().bfill().ne(df.status) & df.status.eq('OPEN')).cumsum()).transform(min).value.ge(70)]
结果:
status value
timestamp
2017-01-01 12:01:00 OPEN 83
2017-01-01 12:02:00 OPEN 82
2017-01-01 12:03:00 OPEN 87
2017-01-01 12:04:00 CLOSE 82
2017-01-01 12:05:00 CLOSE 81
2017-01-01 12:06:00 CLOSE 81
2017-01-01 12:07:00 CLOSE 81
2017-01-01 12:08:00 CLOSE 81
2017-01-01 12:09:00 CLOSE 81
2017-01-01 12:10:00 CLOSE 81
2017-01-01 12:11:00 CLOSE 81
2017-01-01 12:24:00 OPEN 87
2017-01-01 12:25:00 OPEN 87
2017-01-01 12:26:00 OPEN 87
2017-01-01 12:27:00 OPEN 87
2017-01-01 12:28:00 OPEN 87
2017-01-01 12:29:00 CLOSE 75
2017-01-01 12:30:00 CLOSE 75
2017-01-01 12:31:00 CLOSE 75
方法是创建status
不等于先前的组status
,从 开始status == 'OPEN'
。
然后保留value
每组大于或等于 70 的行。
推荐阅读
- excel - 这种不稳定的 VBA 计时器行为是真实的还是我做错了什么
- geolocation - 如何通过将最短路径分成几个距离来找到纬度和经度
- pyspark - 在 pyspark 代码中实现 SAS 的保留功能
- java - 如何创建一个没有其他应用程序接管屏幕区域的屏幕,例如在android java中调用消息和通知
- mixpanel - Mixpanel 使用 api 删除用户数据
- reactjs - Reactjs 拖放
- algorithm - 基于异常数量增加/减少应用程序负载的算法
- jmeter - 如何解决“无法在空对象上调用方法 contains()”
- python-3.x - 比较两个数据框并使用 pandas 或其他包导出不匹配的数据?
- mysql - 如何维护redis和mysql之间的关系