我目前正在处理从某工程工厂接收到的一些数据,这些数据(大致)如下所示:
df = pd.DataFrame({'ID' : np.random.randint(1,25,size=5),
'on/off' : np.random.randint(0,2,size=5),
'Time' : pd.date_range(start='01/01/2019',periods=5,freq='5s')})
print(df)
ID on/off Time
0 17 0 2019-01-01 00:00:00
1 21 0 2019-01-01 00:00:05
2 12 1 2019-01-01 00:00:10
3 12 1 2019-01-01 00:00:15
4 12 0 2019-01-01 00:00:20
“开/关”列中的0和1对应于机器的开或关状态(0 =开1 =关)
当前,我使用下面的漂亮代码行来获取数据滚动时我的列之间的差异
df['Time Difference'] = (df.time - df.time.shift())
print(df)
ID on/off Time Time Difference
0 17 0 2019-01-01 00:00:00 NaT
1 21 0 2019-01-01 00:00:05 00:00:05
2 12 1 2019-01-01 00:00:10 00:00:05
3 12 1 2019-01-01 00:00:15 00:00:05
4 12 0 2019-01-01 00:00:20 00:00:05
现在,由于此数据帧非常详细(每周我将收到约15万行)
什么是总计关闭机器(直到df ['on / off] == 1)直到下一个0出现的时间的最佳方式?因此在上面的示例中,对于2019年1月1日,ID 12的计算机直到15:00:20恢复运行15秒钟后才运行
我对此感到非常困惑。我可以按ID,开-关,日期,时间戳进行分组,但是我不确定如何在单列中滚动数据位。任何帮助或建议,我们将不胜感激。
DN。
答案 0 :(得分:1)
这是一种适用于一个简单示例的方法,该示例在一天的过程中会在开和关之间变化。无论计算机在第一行中处于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
列的dtype为datetime64: df['Time'] = pd.to_datetime(df['Time'])
off
到on
,或从on
到off
: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
on
的行索引:r = df[df['on/off'] == 1].index
df = df.loc[r]
这时,数据框看起来像下面一样。请注意,在time shift
列中显示时间之前,Time
列显示的是机器最近关闭的时间,这是机器重新开机的时间戳。找到这两列之间的差异,可以得出每天机器停机的持续时间:
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
off
状态的每个周期的持续时间来计算总的关闭时间:(df['Time'] - df['time shift']).sum()
哪个输出:
Timedelta('0 days 00:00:15')
有关熊猫.shift()
方法如何工作的其他上下文:
Shift键将一列中的所有行向前或向后移动一定数量。 .shift(1)
告诉熊猫将每行的索引向前或向上移动1。.shift(-1)
告诉熊猫将每行的索引向前或向下移动1。或者将{{1 }}让您查看上一个行索引处的列值,而.shift(1)
让您查看相对于列中给定行的下一个行索引处的列值。这是一种比较不同行中的列值的便捷方法,而无需求助于for循环。