如何根据Pandas的当前状态和以前的状态更改时间列?

2024-04-18 09:17:09 发布

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

我的数据框有四列:p\u Id、Prev\u State、Current\u State、Timestamp。你知道吗

当进程经历多个状态时,用户可能对所有状态具有相同的时间戳。当进程从一个状态转换到另一个状态时,我想为每个数据点添加一个时间戳值(1s)。你知道吗

通过将前一个状态与当前的状态进行比较和匹配,该数据点的相应时间戳将通过添加1s进行修改。但是,如果时间戳值与前一个数据点不同,则我希望保留原始时间戳。你知道吗

注意:我的时间戳值的间隔为30分钟。你知道吗

P_Id   Prev_State   Current_State   Timestamp
001    None          Initial        2019-02-13 18:00:00   
001    Ready         Loading        2019-02-13 18:00:00
001    Initial       Ready          2019-02-13 18:00:00
001    Loading       Executing      2019-02-13 18:30:00
001    Executing     Evaluating     2019-02-13 18:30:00
001    Evaluating    Terminating    2019-02-13 18:30:00

预期产量:

P_Id   Prev_State   Current_State   Timestamp
001    None          Initial        2019-02-13 18:00:00   
001    Ready         Loading        2019-02-13 18:00:02
001    Initial       Ready          2019-02-13 18:00:01
001    Loading       Executing      2019-02-13 18:30:00
001    Executing     Evaluating     2019-02-13 18:30:01
001    Evaluating    Terminating    2019-02-13 18:30:02

我是python的新手。任何帮助都将不胜感激!你知道吗


Tags: 数据noneid进程状态时间currenttimestamp
1条回答
网友
1楼 · 发布于 2024-04-18 09:17:09

这可以通过一些有趣的networkx来完成。我们创建一个有向图,然后形成最长路径。(理想情况下,数据帧总是通过一条路径连接,如示例中所示)。然后我们对它进行排序,使用一个有序的分类,这样我们就可以排序了。最后,为每个新条目添加1并返回序列。你知道吗

import networkx as nx
import pandas as pd
import numpy as np

def add_second(gp):
    # Get Path
    G = nx.from_pandas_edgelist(gp, source='Prev_State', target='Current_State',
                                create_using=nx.DiGraph())
    order = nx.dag_longest_path(G)[:-1]

    # Order
    gp['Prev_State'] = pd.Categorical(gp.Prev_State, ordered=True, categories=order)
    gp = gp.sort_values('Prev_State')

    # Add 1s
    s = gp.Timestamp + pd.to_timedelta(range(len(gp)), unit='s')
    return s

df['new_time'] = df.groupby(['P_Id', 'Timestamp'], group_keys=False).apply(add_second)

输出:

   P_Id  Prev_State Current_State           Timestamp            new_time
0     1        None       Initial 2019-02-13 18:00:00 2019-02-13 18:00:00
1     1       Ready       Loading 2019-02-13 18:00:00 2019-02-13 18:00:02
2     1     Initial         Ready 2019-02-13 18:00:00 2019-02-13 18:00:01
3     1     Loading     Executing 2019-02-13 18:30:00 2019-02-13 18:30:00
4     1   Executing    Evaluating 2019-02-13 18:30:00 2019-02-13 18:30:01
5     1  Evaluating   Terminating 2019-02-13 18:30:00 2019-02-13 18:30:02

相关问题 更多 >