测量从某个条件开始经过的时间

我有以下数据帧:

计时工作
2018-12-01 10:00:00休息
2018-12-01 10:00:02于
2018-12-01 10:00:05于
2018-12-01 10:00:06于
2018-12-01 10:00:07于
2018-12-01 10:00:09休息
2018-12-01 10:00:11休息
2018-12-01 10:00:14于
2018-12-01 10:00:16于
2018-12-01 10:00:18于
2018-12-01 10:00:20休息

我想创建一个新的列,列出设备开始工作以来经过的时间

时间工作运行时间
2018-12-01 10:00:00休息0
2018-12-01 10:00:02月2日
2018-12-01 10:00:05月5日
2018-12-01 10:00:06月6日
2018-12-01 10:00:07月7日
2018-12-01 10:00:09关闭0
2018-12-01 10:00:11关闭0
2018-12-01 10:00:14月3日
2018-12-01 10:00:16 5日
2018-12-01 10:00:18年月7日
2018-12-01 10:00:20关闭0

我怎么做

您可以使用groupby

#df['Time']=pd.to_datetime(df['Time'],errors='concurve')#如果需要,取消注释。
秒=df[‘时间’].dt.second
df[“经过的时间”]=(
sec-sec.groupby(df.Work.eq('Off').cumsum()).transform('first'))
df
时间工作经过时间
0 2018-12-01 10:00:00休息0
2018年12月1日10:00:02
2018年12月5日10:00:05
3 2018-12-01 10:00:06月6日
4 2018-12-01 10:00:07月7日
5 2018-12-01 10:00:09关闭0
6 2018-12-01 10:00:11关闭0
7 2018-12-01 10:00:14月3日
2018年8月5日10:00:16
9 2018-12-01 10:00:18年月7日
10 2018-12-01 10:00:20关闭0

其思想是提取秒数部分,并从状态从“关闭”变为“打开”的第一刻起减去经过的时间。这是使用变换第一次完成的

cumsum用于识别组:

df.Work.eq('Off').cumsum()
0     1
1     1
2     1
3     1
4     1
5     2
6     3
7     3
8     3
9     3
10    4
名称:Work,数据类型:int64

如果您的设备在“打开”状态下可能会跨多分钟,则初始化sec

sec=df['Time'].values.astype(np.int64)//10e8
df[“经过的时间”]=(
sec-sec.groupby(df.Work.eq('Off').cumsum()).transform('first'))
df
时间工作经过时间
0 2018-12-01 10:00:00休息0.0
2018年12月1日10:00:02 2.0
2 2018-12-01 10:00:05 5.0
3 2018-12-01 10:00:06 6.0
4 2018-12-01 10:00:07 7.0
5 2018-12-01 10:00:09休息0.0
6 2018-12-01 10:00:11休息0.0
7 2018-12-01 10:00:14 3.0
8 2018-12-01 10:00:16 5.0
9 2018-12-01 10:00:18 7.0
10 2018-12-01 10:00:20休息0.0

发表评论