Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在所需的日期内正确获取行数?_Python_Pandas - Fatal编程技术网

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。为每个组创建groupID
s
单元格开始。在
对象和
上调用
groupby.groups
以返回一个字典,其中每个值都是组的索引数组。从列
开始创建IntervalIndex
iix
nd
End
。调用字典值上的listcomp,将每个索引数组传递给
iix
,检查
重叠
,并将结果连接到mask
m
。创建mask
m1
检查
对象的组
没有值的单元格
。最后,在
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
会随着预期输出的开始和结束而突然改变?