gpt4 book ai didi

python - 如何正确获得所需日期之间的行?

转载 作者:行者123 更新时间:2023-12-01 07:05:10 24 4
gpt4 key购买 nike

所以我的数据框包含:

  • 对象;
  • 警报;
  • 开始日期时间;
  • 结束日期时间;

看起来像这样:

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]

但是我收到了一个错误,而且我不知道如何获取整个数据帧的结果。

最佳答案

让我们尝试使用 IntervalIndex 和 listcomp。从 cell 开始为每个组创建 groupID s。在 Objects 上调用 groupby.groups 以返回一个字典,其中每个值都是组索引数组。从 StartEnd 列创建 IntervalIndex iix。对字典值调用 listcomp,并将每个索引数组传递给 iix 以检查重叠并将结果连接到掩码 m。创建掩码m1来检查Object组没有值cell。最后,在 m | 上切片 df m1

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

关于python - 如何正确获得所需日期之间的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58475309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com