将timeseries列自身与条件相加

2024-04-25 05:32:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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的机器在00:00:20恢复之前没有运行15秒

我真的很困惑这!我可以按ID、s on-off、日期、时间戳对其进行分组,但我不知道如何处理单个列中的滚动数据位。任何帮助或建议都将不胜感激。你知道吗

DN。你知道吗


Tags: 数据机器iddfsizetimeonnp
1条回答
网友
1楼 · 发布于 2024-04-25 05:32:00

下面是一个简单的例子,一台机器在一天的运行过程中在开和关之间变化。不管机器在第一行是处于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]

在这一点上,dataframe看起来和下面一样。请注意,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')

关于Pandas.shift()方法如何工作的一些附加上下文:

Shift获取一列中的所有行,并将它们向前或向后移动一定量。.shift(1)告诉pandas将每一行的索引向前或向上移动1。.shift(-1)告诉pandas将每行的索引向后或向下移动1。或者,.shift(1)让您在上一行索引中查看列的值,.shift(-1)让您在下一行索引中查看相对于列中给定行的列的值。这是一种方便的方法,可以跨不同的行比较列的值,而无需使用for循环。你知道吗

相关问题 更多 >