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

标签 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    | 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/

相关文章:

python - ehem 恒星时 Python

python - Pandas - Data Frame - reshape 数据框中的值

python - 如何从字典创建 Pandas 数据框并将列表保存在一个单元格中

python - 如何将四列excel数据作为pandas中的两行

python - 如何使管道跳过该步骤(使用 "passthrough")以及 param_grid 中适用于该步骤的所有参数?

python - 在 Python 中跨列应用多个函数(均值、STD 等)

python - Python 3.5 中的时间序列 - 拟合 ARMA 模型

python - 从数据透视表中删除零值会以某种方式产生另一个问题

python - 有没有一种好方法可以从 Alpha Vantage API 中仅提取今天的股市日期数据?

Python pickle 错误 : TypeError: object pickle not returning list