Python 如何在所需的日期内正确获取行数?
所以我有一个数据帧,它有:Python 如何在所需的日期内正确获取行数?,python,pandas,Python,Pandas,所以我有一个数据帧,它有: 对象 警报 开始日期时间 结束日期时间 看起来是这样的: Object | Alarm | Start | End | obj1 | cell | 2014-01-04 16:07:07| 2014-01-04 16:11:07| obj1 | loc | 2014-01-04 16:08:07| 2014-01-04 16:09:07| obj1 | dc
- 对象李>
- 警报李>
- 开始日期时间李>
- 结束日期时间李>
Object | Alarm | Start | End |
obj1 | cell | 2014-01-04 16:07:07| 2014-01-04 16:11:07|
obj1 | loc | 2014-01-04 16:08:07| 2014-01-04 16:09:07|
obj1 | dc | 2014-01-04 16:11:08| 2014-01-04 16:12:07|
obj1 | bat | 2014-01-04 16:12:07| 2014-01-04 16:13:07|
obj2 | cell | 2014-01-04 16:12:07| 2014-01-04 16:15:07|
obj2 | loc | 2014-01-04 16:16:07| 2014-01-04 16:17:07|
obj2 | cell | 2014-01-04 16:17:07| 2014-01-04 16:19:07|
obj2 | bat | 2014-01-04 16:17:07| 2014-01-04 16:18:07|
obj3 | loc | 2014-01-04 16:07:07| 2014-01-04 16:07:07|
obj3 | dc | 2014-01-04 16:07:07| 2014-01-04 16:07:07|
我想做的是删除在单元警报开始和单元警报结束之间发生的每个对象的所有警报。因此,生成的数据帧必须如下所示:
Object | Alarm | Start | End |
obj1 | dc | 2014-01-04 16:05:07| 2014-01-04 16:06:07|
obj1 | bat | 2014-01-04 16:12:07| 2014-01-04 16:13:07|
obj2 | loc | 2014-01-04 16:16:07| 2014-01-04 16:17:07|
obj3 | loc | 2014-01-04 16:07:07| 2014-01-04 16:07:07|
obj3 | dc | 2014-01-04 16:07:07| 2014-01-04 16:07:07|
我试着做一些类似的事情
for obj in data['Object'].unique():
dt = data[data['Object']==obj]
start = dt[dt['Alarm']=='cell']['Start']
end = dt[dt['Alarm']=='cell']['End']
mask = (dt['Start'] >= start) & (dt['End'] <= end)
dt.loc[~mask]
数据['Object']中对象的。唯一()
dt=数据[数据['Object']==obj]
start=dt[dt['Alarm']=='cell']['start']
end=dt[dt['Alarm']=='cell']['end']
掩码=(dt['Start']>=Start)和(dt['End']让我们尝试使用IntervalIndex
和listcomp。为每个组创建groupIDs
从单元格开始。在对象和上调用groupby.groups
以返回一个字典,其中每个值都是组的索引数组。从列开始创建IntervalIndexiix
ndEnd
。调用字典值上的listcomp,将每个索引数组传递给iix
,检查重叠
,并将结果连接到maskm
。创建maskm1
检查对象的组
没有值的单元格
。最后,在m | m1
上切片df
s = (df.Alarm.eq('cell') & df.Alarm.ne('cell').shift(-1, fill_value='True')).cumsum()
d = s.groupby([df.Object, s]).groups
iix = pd.IntervalIndex.from_arrays(df.Start, df.End, closed='both')
m = np.concatenate([~iix[x].overlaps(iix[x[0]]) for x in d.values()])
m1 = df.groupby(df.Object).Alarm.transform(lambda x: x.ne('cell').all())
df[m | m1]
Out[187]:
Object Alarm Start End
2 obj1 dc 2014-01-04 16:11:08 2014-01-04 16:12:07
3 obj1 bat 2014-01-04 16:12:07 2014-01-04 16:13:07
5 obj2 loc 2014-01-04 16:16:07 2014-01-04 16:17:07
8 obj3 loc 2014-01-04 16:07:07 2014-01-04 16:07:07
9 obj3 dc 2014-01-04 16:07:07 2014-01-04 16:07:07
关于obj2
,那里有两个单元格,必须使用哪一个?@Erfan这是问题之一。我们必须获得每个单元格记录的开始和结束日期。Oke,为什么obj1
,dc
会随着预期输出的开始和结束而突然改变?