首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在按条件检索时间行。让代码在一天内正常工作

正在按条件检索时间行。让代码在一天内正常工作
EN

Stack Overflow用户
提问于 2019-12-03 21:13:38
回答 2查看 38关注 0票数 0

我有一个事件的df。基本示例可以通过代码重现:

代码语言:javascript
运行
复制
data = [['2019-01-11 16:27:39', 'AC', '2019-01-11 16:54:53'], ['2019-01-11 16:27:39', 'DC', '2019-01-11 16:54:53'], ['2019-01-11 17:03:42', 'AC', '2019-01-14 10:00:25'], ['2019-01-11 17:03:42', 'DC', '2019-01-14 09:58:39'], ['2019-01-11 17:03:42', 'Battery', '2019-01-14 10:00:48'], ['2019-01-11 17:03:48', 'Cell', '2019-01-12 17:26:48'], ['2019-01-14 10:00:36', 'DC', '2019-01-14 10:33:42'], ['2019-01-14 10:32:42', 'AC', '2019-01-14 10:45:27']]  

df = pd.DataFrame(data, columns = ['Start', 'Alarm', 'End'])  
df['Start'] = pd.to_datetime(df['Start'], format='%d.%m.%Y %H:%M:%S')
df['End'] = pd.to_datetime(df['End'], format='%d.%m.%Y %H:%M:%S')

我的总体目标是监控发生的警报。诸如直流/电池/电池之类的报警通常与交流电源同时或稍后发生。

因此,我想添加“AC Start”列,该列将填充与其他告警相关联的对应AC告警的时间戳,然后计算AC告警发生与其他告警发生之间的时间差。

下面是我的代码:

代码语言:javascript
运行
复制
ac_mask = df.Alarm.eq('AC')
df['AC Start'] = df.Start.where(ac_mask).ffill().mask(ac_mask)
df['AC End'] = df.End.where(ac_mask).ffill().mask(ac_mask)
df['Time between events'] = (df['Start'] - df['AC Start']).dt.total_seconds()/60  

它工作得很好,直到我面临警报比正确的AC更早发生,并与错误关联的情况。(见图)

所以我的问题是,我如何调整代码,使其只在一天内工作,以查找匹配项?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-03 22:51:26

只需对您的ac_mask进行一些额外的过滤,并稍微更改一下创建AC StartAC End的方式:

代码语言:javascript
运行
复制
# 1. Change condition to ne('AC') instead of eq('AC')
# 2. Add conditional that Start must be on the same date, backfilled NA values

ac_mask = df.Alarm.ne('AC') & df.Start.dt.date.eq(df.Start.shift().bfill().dt.date)

让我们看看现在的面具是什么样子的:

代码语言:javascript
运行
复制
>>> df['ac_mask'] = ac_mask
>>> df[['Start', 'Alarm', 'ac_mask']]
                Start    Alarm  ac_mask
0 2019-01-11 16:27:39       AC    False
1 2019-01-11 16:27:39       DC     True
2 2019-01-11 17:03:42       AC    False
3 2019-01-11 17:03:42       DC     True
4 2019-01-11 17:03:42  Battery     True
5 2019-01-11 17:03:48     Cell     True
6 2019-01-14 10:00:36       DC    False   # <-- Alarm on different date is no longer captured
7 2019-01-14 10:32:42       AC    False

现在还要调整掩码AC StartAC End的方式

代码语言:javascript
运行
复制
df['AC Start'] = df.Start.mask(ac_mask).ffill().where(ac_mask)
df['AC End'] = df.End.mask(ac_mask).ffill().where(ac_mask)

其余的都是一样的:

代码语言:javascript
运行
复制
df['Time between events'] = (df['Start'] - df['AC Start']).dt.total_seconds()/60  

>>> df
                Start    Alarm                 End            AC Start              AC End  Time between events  
0 2019-01-11 16:27:39       AC 2019-01-11 16:54:53                 NaT                 NaT                  NaN     
1 2019-01-11 16:27:39       DC 2019-01-11 16:54:53 2019-01-11 16:27:39 2019-01-11 16:54:53                  0.0  
2 2019-01-11 17:03:42       AC 2019-01-14 10:00:25                 NaT                 NaT                  NaN  
3 2019-01-11 17:03:42       DC 2019-01-14 09:58:39 2019-01-11 17:03:42 2019-01-14 10:00:25                  0.0  
4 2019-01-11 17:03:42  Battery 2019-01-14 10:00:48 2019-01-11 17:03:42 2019-01-14 10:00:25                  0.0  
5 2019-01-11 17:03:48     Cell 2019-01-12 17:26:48 2019-01-11 17:03:42 2019-01-14 10:00:25                  6.0  
6 2019-01-14 10:00:36       DC 2019-01-14 10:33:42                 NaT                 NaT                  NaN  
7 2019-01-14 10:32:42       AC 2019-01-14 10:45:27                 NaT                 NaT                  NaN  
票数 1
EN

Stack Overflow用户

发布于 2019-12-03 22:15:20

用循环解决了这个问题,但肯定有更好的方法。因此,这个问题仍然悬而未决。

代码语言:javascript
运行
复制
as_start = tr[tr['Alarm']=='AC']['Start'].dt.date.unique()  

dt = pd.DataFrame([])
for date in as_start:
    tt = tr[tr['Start'].dt.date==date]
    ac_mask = tt.Alarm.eq('AC')
    tt['AC Start'] = tt.Start.where(ac_mask).ffill().mask(ac_mask) 
    tt['AC End'] = tt.End.where(ac_mask).ffill().mask(ac_mask)
    tt['Time between events'] = (tt['Start'] - tt['AC Start']).dt.total_seconds()/60
    dt = dt.append(tt)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59157967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档