下面是一个方法,它适用于一台机器的简单示例,该机器在一天的运行过程中在开与关之间变化。不管机器是否在
on
或
off
状态在第一行。
df = pd.DataFrame({'ID': [12, 12, 12, 12, 12],
'on/off': [0,0,1,0,1],
'Time': ['2019-01-01 00:00:00', '2019-01-01 00:00:05', '2019-01-01 00:00:10','2019-01-01 00:00:15','2019-01-01 00:00:20']
})
ID on/off Time
0 12 0 2019-01-01 00:00:00
1 12 0 2019-01-01 00:00:05
2 12 1 2019-01-01 00:00:10
3 12 0 2019-01-01 00:00:15
4 12 1 2019-01-01 00:00:20
-
首先我确定
Time
列数据类型为datetime64:
df['Time'] = pd.to_datetime(df['Time'])
-
然后我得到状态改变的所有行的索引(从
远离的
到
在
,或来自
在
到
远离的
:
s = df[df['on/off'].shift(1) != df['on/off']].index
df = df.loc[s]
-
然后我创建一个名为
time shift
,显示电源状态更改的最近一行的时间戳:
df['time shift'] = df['Time'].shift(1)
此时,数据帧如下所示:
ID on/off Time time shift
0 12 0 2019-01-01 00:00:00 NaT
2 12 1 2019-01-01 00:00:10 2019-01-01 00:00:00
3 12 0 2019-01-01 00:00:15 2019-01-01 00:00:10
4 12 1 2019-01-01 00:00:20 2019-01-01 00:00:15
-
现在,由于我们想计算机器关闭的持续时间,我只查看状态变为
在
:
r = df[df['on/off'] == 1].index
df = df.loc[r]
在这一点上,数据帧看起来和下面一样。注意到
时移
列显示机器最近关闭的点,时间显示在
时间
列,这是机器重新启动时的时间戳。找到这两列之间的差异将为我们提供机器在一天内关闭的每个持续时间的长度:
ID on/off Time time shift
2 12 1 2019-01-01 00:00:10 2019-01-01 00:00:00
4 12 1 2019-01-01 00:00:20 2019-01-01 00:00:15
-
下一行通过求和机器所在的每个周期的持续时间来计算总的停机时间。
远离的
状态:
(df['Time'] - df['time shift']).sum()
输出:
Timedelta('0 days 00:00:15')
关于熊猫如何
.shift()
方法工作:
SHIFT获取列中的所有行,并将它们向前或向后移动一定量。
.shift(1)
告诉熊猫将每行的索引向前或向上移动1。
.shift(-1)
告诉熊猫将每行的索引向后或向下移动1。交替放置,
换档(1)
允许您查看前一行索引中列的值,以及
换档(- 1)
允许您在下一行索引处查看列的值,相对于列中的给定行。这是一种比较不同行中列值的简便方法,而不必使用for循环。