【问题标题】:How to calculate time difference in between same rows step by step continously in pandas python如何在pandas python中逐步计算同一行之间的时间差
【发布时间】:2019-08-20 10:09:26
【问题描述】:

这里我有一个数据集,其中包含三个输入 x1、x2、x3 以及日期和时间。在我的 X3 列中,我的行中有类似的值。

我想要做的是当开始时间为 0 时,我想逐行查找相似值的时间差。

这里我使用了代码

df['time_diff']= pd.to_datetime(df['date'] + " " + df['time'],
                            format='%d/%m/%Y %H:%M:%S', dayfirst=True)

mask = df['x3'].ne(0)
df['Duration'] = df[mask].groupby(['date','x3'])['time_diff'].transform('first')
df['Duration'] = df['time_diff'].sub(df['Duration']).dt.total_seconds().div(3600)

这段代码给出了这个值。

date	time	                x3         Expected output of time difference
10/3/2018	6:00:00	        0          NaN
10/3/2018	7:00:00	        5          0 =start time for 5
10/3/2018	8:00:00	        0          NaN
10/3/2018	9:00:00	        7          0=start time for 7
10/3/2018	10:00:00	0          NaN
10/3/2018	11:00:00	0          NaN
10/3/2018	12:00:00	0          NaN
10/3/2018	13:45:00	0          NaN
10/3/2018	15:00:00	0          NaN
10/3/2018	16:00:00	0          NaN
10/3/2018	17:00:00	0          NaN
10/3/2018	18:00:00	0          NaN
10/3/2018	19:00:00	5          12 hr =from starting time of 5
10/3/2018	20:00:00	0          NaN
10/3/2018	21:30:00	7          12.30hr = from starting time of 7
10/4/2018	6:00:00	        0         NaN
10/4/2018	7:00:00	        0         NaN
10/4/2018	8:00:00	        5         0 = starting time of 5 because new day
10/4/2018	9:00:00	        7         0 = starting time of 5 because new day
10/4/2018	11:00:00	5         3hr
10/4/2018	12:00:00	5         4hr
10/4/2018	13:00:00	5         5hr
10/4/2018	16:00:00	0         NaN
10/4/2018	17:00:00	0         NaN
10/4/2018	18:00:00	7         11hr

但我期望的输出是我想用时间均值逐步找到时间差:

date	time	      x3   Expected for 5 (time_diff) Expected for 7(time_diff) 
10/3/2018 6:00:00     0      NaN                      NaN
10/3/2018 7:00:00     5      0 =start time for 5      NaN
10/3/2018 8:00:00     0      1hr                      NaN
10/3/2018 9:00:00     7      1hr                      0=start time for 7                          
10/3/2018 11:00:00    0      1hr                      1hr
10/3/2018 12:00:00    0      1hr                      1hr
10/3/2018 13:45:00    0      1.45hr                   1.45hr
10/3/2018 15:00:00    0      1.15hr                   1.15hr
10/3/2018 16:00:00    0      1hr                      1hr
10/3/2018 17:00:00    0      1hr                      1hr
10/3/2018 18:00:00    0      1hr                      1hr
10/3/2018 19:00:00    5     0 hr =nextstartingtime5   1hr
10/3/2018 20:00:00    0      1hr                       1hr
10/3/2018 21:30:00    7      1.5hr                    0 =starting 7
10/4/2018 6:00:00     0      1hr                       1hr
10/4/2018 7:00:00     0      1hr                       1hr
10/4/2018 8:00:00     5      0 = startingbecausenewda  1hr
10/4/2018 9:00:00     7      1hr                       0 =starting time for 7
10/4/2018 11:00:00    5      2hr                      2hr
10/4/2018 12:00:00    5      1hr                      1hr

【问题讨论】:

    标签: python pandas time


    【解决方案1】:

    您可以在x3 列中处理所有没有0 的唯一值:

    df['time_diff']= pd.to_datetime(df['date'] + " " + df['time'],
                                format='%d/%m/%Y %H:%M:%S', dayfirst=True)
    
    for x in df.loc[df['x3'].ne(0), 'x3'].unique():
        s = df['x3'].eq(x).cumsum()
        df['Expected {}'.format(x)] = (df[s != 0].groupby(['date',s])['time_diff']
                                                    .diff()
                                                    .dt.total_seconds()
                                                    .div(3600)
                                                    .fillna(0))
    

    print (df)
             date      time  x3 Expected           time_diff  Expected 5  \
    0   10/3/2018   6:00:00   0      NaN 2018-03-10 06:00:00         NaN   
    1   10/3/2018   7:00:00   5        0 2018-03-10 07:00:00        0.00   
    2   10/3/2018   8:00:00   0      NaN 2018-03-10 08:00:00        1.00   
    3   10/3/2018   9:00:00   7        0 2018-03-10 09:00:00        1.00   
    4   10/3/2018  10:00:00   0      NaN 2018-03-10 10:00:00        1.00   
    5   10/3/2018  11:00:00   0      NaN 2018-03-10 11:00:00        1.00   
    6   10/3/2018  12:00:00   0      NaN 2018-03-10 12:00:00        1.00   
    7   10/3/2018  13:45:00   0      NaN 2018-03-10 13:45:00        1.75   
    8   10/3/2018  15:00:00   0      NaN 2018-03-10 15:00:00        1.25   
    9   10/3/2018  16:00:00   0      NaN 2018-03-10 16:00:00        1.00   
    10  10/3/2018  17:00:00   0      NaN 2018-03-10 17:00:00        1.00   
    11  10/3/2018  18:00:00   0      NaN 2018-03-10 18:00:00        1.00   
    12  10/3/2018  19:00:00   5     12hr 2018-03-10 19:00:00        0.00   
    13  10/3/2018  20:00:00   0      NaN 2018-03-10 20:00:00        1.00   
    14  10/3/2018  21:30:00   7  12.30hr 2018-03-10 21:30:00        1.50   
    15  10/4/2018   6:00:00   0      NaN 2018-04-10 06:00:00        0.00   
    16  10/4/2018   7:00:00   0      NaN 2018-04-10 07:00:00        1.00   
    17  10/4/2018   8:00:00   5        0 2018-04-10 08:00:00        0.00   
    18  10/4/2018   9:00:00   7        0 2018-04-10 09:00:00        1.00   
    19  10/4/2018  11:00:00   5      3hr 2018-04-10 11:00:00        0.00   
    20  10/4/2018  12:00:00   5      4hr 2018-04-10 12:00:00        0.00   
    21  10/4/2018  13:00:00   5      5hr 2018-04-10 13:00:00        0.00   
    22  10/4/2018  16:00:00   0      NaN 2018-04-10 16:00:00        3.00   
    23  10/4/2018  17:00:00   0      NaN 2018-04-10 17:00:00        1.00   
    24  10/4/2018  18:00:00   7     11hr 2018-04-10 18:00:00        1.00   
    
        Expected 7  
    0          NaN  
    1          NaN  
    2          NaN  
    3         0.00  
    4         1.00  
    5         1.00  
    6         1.00  
    7         1.75  
    8         1.25  
    9         1.00  
    10        1.00  
    11        1.00  
    12        1.00  
    13        1.00  
    14        0.00  
    15        0.00  
    16        1.00  
    17        1.00  
    18        0.00  
    19        2.00  
    20        1.00  
    21        1.00  
    22        3.00  
    23        1.00  
    24        0.00  
    

    【讨论】:

    • 干草非常感谢。你的回答很棒。我有一个问题,这里提到了两列,预计 5 和 7 。我可以将这些值作为命名列,如 df['time_diff_5] 和 df ['time_diff_7] 这样
    • @team - 当然,只需更改 df['Expected {}'.format(x)] 就像需要 df['time_diff_{}'.format(x)]
    • 对不起,我还有一个问题,我可以将这两列值放在一列吗?
    • @team - 因为所有新列都应该有 sum 或类似的,但不确定是否需要。
    • 不不,没关系,你用这些惊人的代码帮助了我很多。我找到了另一种方法非常感谢。
    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多