用条件将其自身上的时间序列列求和

时间:2019-01-28 22:34:38

标签: python pandas dataframe time

我目前正在处理从某工程工厂接收到的一些数据,这些数据(大致)如下所示:

    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。

1 个答案:

答案 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
  1. 首先,我确保Time列的dtype为datetime64:

df['Time'] = pd.to_datetime(df['Time'])

  1. 然后,我获得状态更改的所有行的索引(从offon,或从onoff
s = df[df['on/off'].shift(1) != df['on/off']].index
df = df.loc[s]
  1. 然后我创建一个名为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
  1. 现在,由于我们要计算机器关闭的持续时间,因此我仅查看状态变为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
  1. 下面的行通过求和机器处于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循环。