python - 如果时间不是连续组的一部分,如何删除索引?
问题描述
如果我有一个带有日期时间列的 pandas DataFrame,如下所示:
2018-01-16 01:51:10
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:59
2018-01-16 01:57:59
2018-01-16 01:57:59
2018-01-16 01:58:00
2018-01-16 01:58:00
2018-01-16 01:58:01
2018-01-16 01:58:01
2018-01-16 02:00:00
2018-01-16 02:45:01
2018-01-16 02:45:01
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:03
2018-01-16 02:45:04
2018-01-16 02:45:04
2018-01-16 02:45:05
2018-01-16 02:45:06
2018-01-16 02:45:07
2018-01-16 02:45:07
2018-01-16 02:45:08
2018-01-16 02:58:55
如何删除不在分组/异常值时间中的时间,以便如果时间距离一组时间超过 1 秒,它将被丢弃。我想得到一个像这样的熊猫数据框:
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:58
2018-01-16 01:57:59
2018-01-16 01:57:59
2018-01-16 01:57:59
2018-01-16 01:58:00
2018-01-16 01:58:00
2018-01-16 01:58:01
2018-01-16 01:58:01
2018-01-16 02:45:01
2018-01-16 02:45:01
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:02
2018-01-16 02:45:03
2018-01-16 02:45:04
2018-01-16 02:45:04
2018-01-16 02:45:05
2018-01-16 02:45:06
2018-01-16 02:45:07
2018-01-16 02:45:07
2018-01-16 02:45:08
解决方案
样本数据:
import pandas as pd
idx = [
"2018-01-16 01:51:10", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:58", "2018-01-16 01:57:59", "2018-01-16 01:57:59", "2018-01-16 01:57:59", "2018-01-16 01:58:00", "2018-01-16 01:58:00", "2018-01-16 01:58:01", "2018-01-16 01:58:01", "2018-01-16 02:00:00", "2018-01-16 02:45:01", "2018-01-16 02:45:01", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:02", "2018-01-16 02:45:03", "2018-01-16 02:45:04", "2018-01-16 02:45:04", "2018-01-16 02:45:05", "2018-01-16 02:45:06", "2018-01-16 02:45:07", "2018-01-16 02:45:07", "2018-01-16 02:45:08", "2018-01-16 02:58:55",
]
df = pd.DataFrame(range(len(idx)), index=idx, columns=["col"])
df.index = pd.to_datetime(df.index)
取两个方向的一阶差分:
bdiff = np.abs((df.index[1:] - df.index[:-1]).total_seconds())
fdiff = np.abs((df.index[:-1] - df.index[1:]).total_seconds())
现在,这些中的每一个实际上都是一个太短的元素。bdiff
排除第一个元素,而fdiff
排除最后一个元素。所以,填充它们:
bdiff = np.insert(bdiff, 0, 99.)
fdiff = np.append(fdiff, 99.)
最后,由此形成一个布尔掩码;掩码是True
一个值距离它周围的两个值超过一秒的地方:
>>> mask = (bdiff > 1.0) & (fdiff > 1.0)
... print(df.loc[~mask])
col
2018-01-16 01:57:58 1
2018-01-16 01:57:58 2
2018-01-16 01:57:58 3
2018-01-16 01:57:58 4
2018-01-16 01:57:58 5
2018-01-16 01:57:59 6
2018-01-16 01:57:59 7
2018-01-16 01:57:59 8
2018-01-16 01:58:00 9
2018-01-16 01:58:00 10
2018-01-16 01:58:01 11
2018-01-16 01:58:01 12
2018-01-16 02:45:01 14
2018-01-16 02:45:01 15
2018-01-16 02:45:02 16
2018-01-16 02:45:02 17
2018-01-16 02:45:02 18
2018-01-16 02:45:02 19
2018-01-16 02:45:03 20
2018-01-16 02:45:04 21
2018-01-16 02:45:04 22
2018-01-16 02:45:05 23
2018-01-16 02:45:06 24
2018-01-16 02:45:07 25
2018-01-16 02:45:07 26
2018-01-16 02:45:08 27
>>> mask
array([ True, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, True])
推荐阅读
- javascript - 如何在面向对象的 JS 中进行事件委托?
- java - 如何在 Eclipse Spring 中安装旧 Java 版本和新版本?
- c++ - 从 C++ 禁用控制台的快速编辑模式
- forms - 从帮助类事件监听器回调 ContentPage
- c - 我是否必须在控制流图中考虑预处理器指令?
- r - 使用 fct_lump() 时的“二元运算符的非数字参数”
- java - 如何将另一个对象序列化为现有文件?
- react-native - 是否可以在后台 APP 上构建 24/7 运行?
- sentiment-analysis - 用于训练文本分类器的德语数据集
- javascript - DateRangeSelection 控件中是否有类似于 livechange 的内容?