繁体   English   中英

计算同一 pandas 列中两个不同值之间的时间

[英]Calculate time between two different values in the same pandas column

我的数据如下所示

Device     Time        Condition
D1  01/11/2019 00:00    issue
D1  01/11/2019 00:15    issue
D1  01/11/2019 00:30    issue
D1  01/11/2019 00:45    issue
D1  01/11/2019 01:00    issue
D1  01/11/2019 01:15    Resolved
D1  01/11/2019 01:30    Resolved
D2  01/11/2019 01:45    issue
D2  01/11/2019 02:00    Resolved
D1  01/11/2019 01:45    issue
D1  01/11/2019 02:00    Resolved

我需要创建一个新列来查找第一个问题和第一个解决之间的时间。 我需要一个 groupby 声明,它将保留第一个问题并解决所有问题的第一个问题。 然后找时间 - 当我使用按设备分组并调节它时,每个设备只保留一个问题。

所需的 output 如下所示

Device  Time    Condition   durationTofix
D1  01/11/2019 00:00    issue   
D1  01/11/2019 00:15    issue   
D1  01/11/2019 00:30    issue   
D1  01/11/2019 00:45    issue   
D1  01/11/2019 01:00    issue   
D1  01/11/2019 01:15    Resolved    01:15
D1  01/11/2019 01:30    Resolved    
D2  01/11/2019 01:45    issue   
D2  01/11/2019 02:00    Resolved    00:15
D1  01/11/2019 01:45    issue   
D1  01/11/2019 02:00    Resolved    00:15

由于 groupby 设备和条件还不够,我想创建一个索引列

data["index"] = data.groupby(['Device','condition']).??? #Something like cumcount() but it is not cumcount in this case

然后使用 pivot 表进行时间计算

H = data.pivot_table(index=['index','Device'], columns=['condition'], values='Timestamp',aggfunc=lambda x: x)
H['durationTofix'] = H['Resolved']- H['issue']

如果在Resolved per continuous groups by Device之前始终存在至少一个问题,则解决方案:

#converting to datetimes
df['Time'] = pd.to_datetime(df['Time'])

#consetutive groups
g = df['Device'].ne(df['Device'].shift()).cumsum()
#test issue values
m = df['Condition'].eq('issue')
#replace not issue to missing values
i = df['Time'].where(m)

#get first duplicated rows by consecutive groups and condition column
mask = ~df.assign(g=g,i=i).duplicated(['g','Condition']) 
#forward filling Time by first issue per groups
s = df['Time'].where(mask & m).groupby(g).ffill()

#subtract and filter only first Resolved per groups
df['durationTofix'] = df['Time'].sub(s).where(mask & df['Condition'].eq('Resolved'))
print (df)
   Device                Time Condition durationTofix
0      D1 2019-01-11 00:00:00     issue           NaT
1      D1 2019-01-11 00:15:00     issue           NaT
2      D1 2019-01-11 00:30:00     issue           NaT
3      D1 2019-01-11 00:45:00     issue           NaT
4      D1 2019-01-11 01:00:00     issue           NaT
5      D1 2019-01-11 01:15:00  Resolved      01:15:00
6      D1 2019-01-11 01:30:00  Resolved           NaT
7      D2 2019-01-11 01:45:00     issue           NaT
8      D2 2019-01-11 02:00:00  Resolved      00:15:00
9      D1 2019-01-11 01:45:00     issue           NaT
10     D1 2019-01-11 02:00:00  Resolved      00:15:00

最大的问题是如何正确分组/解决您的问题,这可以通过反向cumsum来完成:

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

df["group"] = (df["Condition"].eq("Resolved")&df["Condition"].shift(-1).eq("issue"))[::-1].cumsum()[::-1]

df["diff"] = (df[~df.duplicated(["Condition","group"])].groupby("group")["Time"].transform(lambda d: d.diff()))

print (df)

   Device                Time Condition  group     diff
0      D1 2019-01-11 00:00:00     issue      2      NaT
1      D1 2019-01-11 00:15:00     issue      2      NaT
2      D1 2019-01-11 00:30:00     issue      2      NaT
3      D1 2019-01-11 00:45:00     issue      2      NaT
4      D1 2019-01-11 01:00:00     issue      2      NaT
5      D1 2019-01-11 01:15:00  Resolved      2 01:15:00
6      D1 2019-01-11 01:30:00  Resolved      2      NaT
7      D2 2019-01-11 01:45:00     issue      1      NaT
8      D2 2019-01-11 02:00:00  Resolved      1 00:15:00
9      D1 2019-01-11 01:45:00     issue      0      NaT
10     D1 2019-01-11 02:00:00  Resolved      0 00:15:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM