如何根据列值计算行之间的时间差?

3
我有一个像这样的pandas数据框:
状态 时间戳
通过 2021-11-25 15:15:36
失败 2021-11-25 00:46:23
失败 2021-11-25 00:16:03
失败 2021-11-24 23:45:08
通过 2021-11-25 15:15:13
失败 2021-11-25 00:46:47
失败 2021-11-25 00:16:09
失败 2021-11-24 23:44:59
我需要获取第一个通过事件到该序列下第一次失败的时间。例如,row 0row 3之间的差异,并将其添加到新的列中。
然后我需要计算下一个序列并将其添加到新列中的值中。即row 4row 7之间的差异,并将差异添加到前一个时间,以获取它总共失败了多长时间。
这是df最终应该的样子:
状态 时间戳 停机时间 总停机时间
通过 2021-11-25 15:15:36 15:30:38 31:00:52
失败 2021-11-25 00:46:23 15:30:38 31:00:52
失败 2021-11-25 00:16:03 15:30:38 31:00:52
失败 2021-11-24 23:45:08 15:30:38 31:00:52
通过 2021-11-25 15:15:13 15:30:14 31:00:52
失败 2021-11-25 00:46:47 15:30:14 31:00:52
失败 2021-11-25 00:16:09 15:30:14 31:00:52
失败 2021-11-24 23:44:59 15:30:14 31:00:52

请注意,这是示例数据,通过和失败事件的索引每次都不同。

这是我的代码

import pandas as pd

data = {'Status': ['Passing','Failing','Failing','Failing','Passing','Failing','Failing','Failing'],

'TimeStamp': ['2021-11-25 15:15:36','2021-11-25 00:46:23','2021-11-25 00:16:03','2021-11-24 23:45:08','2021-11-25 15:15:13','2021-11-25 00:46:47','2021-11-25 00:16:09','2021-11-24 23:44:59']}

df = pd.DataFrame(data)

我是自学 Python 和 pandas 的,不知道如何实现我需要的功能。感激不尽,希望能得到帮助。


请提供您所需的df输出格式样本。 - Fatemeh Sangin
你说你想将它们添加到新列中。这个列是 df 的一部分吗? 如果是,那么该列的哪一行? - Fatemeh Sangin
或者您想将它添加到与df不同的新数组中? - Fatemeh Sangin
@FatemehSangin 我已经更新了问题,包括最终需要它看起来像什么。 - jmin
抱歉我两天内没空。你还卡住了需要我更新答案吗? - Fatemeh Sangin
1个回答

0

在下面,您可以构建“停机时间”列:

from datetime import datetime as dt,timedelta as td

df.loc[:,'Downtime'] = dt.now()
prevPassIdx = 0
prevOldest = dt.now()
timestamps = []

for i in range(1, len(df['TimeStamp'])):
    if df['Status'][i] == 'Passing':
        if i!=0:
            timestamps.append(dt.strptime(df.iloc[prevPassIdx,1],"%Y-%m-%d %H:%M:%S")- prevOldest)
            df.iloc[prevPassIdx:i,2]=timestamps[-1]
        prevPassIdx = i
        prevOldest = dt.now()
    else:
        if dt.strptime(df['TimeStamp'][i],"%Y-%m-%d %H:%M:%S") <prevOldest:
            prevOldest = dt.strptime(df['TimeStamp'][i],"%Y-%m-%d %H:%M:%S")
if df['Status'][i] != ('Passing'):
    timestamps.append(dt.strptime(df.iloc[prevPassIdx,1],"%Y-%m-%d %H:%M:%S") - prevOldest)
    df.iloc[prevPassIdx:i+1,2]= timestamps[-1]

在下面,您可以建立“总停机时间”列:

delta = td()
for t in timestamps:
    delta = delta+ t
seconds = delta.total_seconds()
hours = seconds//3600
minutes = (seconds//60)%60
seconds = seconds %60
df.loc[:, 'Total Downtime'] = '{:02d}:{:02d}:{:02d}'.format(int(hours),int(minutes),int(seconds))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接