我目前正在处理我从一家工程工厂收到的一些数据,这些数据(大致)如下:
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。你知道吗
下面是一个简单的例子,一台机器在一天的运行过程中在开和关之间变化。不管机器在第一行是处于
on
还是off
状态,它都可以工作。你知道吗Time
列的dtype是datetime64:df['Time'] = pd.to_datetime(df['Time'])
off
到on
,或者从on
到off
):time shift
的列,它显示电源状态更改的最近一行的时间戳:此时,数据帧如下所示:
on
的行索引:在这一点上,dataframe看起来和下面一样。请注意,
time shift
列显示的是机器最近关闭的时间点,在Time
列显示的时间之前,这是机器重新打开时的时间戳。找出这两列之间的差异,我们将得到机器在一天中关闭的每个持续时间的长度:off
状态的每个时段的持续时间求和来计算总关闭时间:输出:
关于Pandas
.shift()
方法如何工作的一些附加上下文:Shift获取一列中的所有行,并将它们向前或向后移动一定量。
.shift(1)
告诉pandas将每一行的索引向前或向上移动1。.shift(-1)
告诉pandas将每行的索引向后或向下移动1。或者,.shift(1)
让您在上一行索引中查看列的值,.shift(-1)
让您在下一行索引中查看相对于列中给定行的列的值。这是一种方便的方法,可以跨不同的行比较列的值,而无需使用for循环。你知道吗相关问题 更多 >
编程相关推荐