【问题标题】:How to compute the time difference between entries?如何计算条目之间的时间差?
【发布时间】:2018-10-16 12:15:45
【问题描述】:

假设我有以下 Pandas DataFrame。我想计算自上次观察每个ip 以来的时间(以秒为单位)。请注意,数据不一定是有序的。

dict = {'ip':[123, 326, 123, 326], 'hour': [14, 12, 12, 1], 'minute': [54, 23, 41, 8], 'second': [45, 29, 19, 33]}

df = pd.DataFrame(dict, columns = dict.keys())

       ip  hour  minute  second
0  123    14      54      45
1  326    12      23      29
2  123    12      41      19
3  326     1       8      33

例如,我想在第一个条目上添加一列,说明当 ip 123 第二次被捕获时,以秒为单位的 (14:54:45 - 12:41:19) 有自上次出现在数据集中以来已过去。

我正在尝试使用groupby,但没有成功。有什么想法吗?

提前致谢!!!

【问题讨论】:

标签: python pandas datetime pandas-groupby


【解决方案1】:

您可以使用 to_datetime 将您的小时、分钟、秒列转换为日期时间,然后我们 groupby 并得到不同的 (diff)

df['Time']=pd.to_datetime(df.iloc[:,1:].astype(str).apply(''.join,1),format='%H%M%S')

df['Yourneed']=df.groupby('ip').Time.diff().dt.total_seconds()
df
    ip  hour  minute  second                Time  Yourneed
0  123    14      54      45 1900-01-01 14:54:45       NaN
1  326    12      23      29 1900-01-01 12:23:29       NaN
2  123    12      41      19 1900-01-01 12:41:19   -8006.0
3  326     1       8      33 1900-01-01 18:03:03   20374.0

【讨论】:

    【解决方案2】:

    您与 groupby 关系密切。创建适当的日期时间列可能是缺少的部分:

    from datetime import datetime
    import pandas
    
    def row_to_date(row):
        today = datetime.today()
        return datetime(
            today.year,
            today.month,
            today.day,
            row['hour'],
            row['minute'],
            row['second']
        )
    
    
    data = {
        'ip':[123, 326, 123, 326],
        'hour': [14, 12, 12, 1],
        'minute': [54, 23, 41, 8],
        'second': [45, 29, 19, 33]
    }
    
    
    df = (
        pandas.DataFrame(data)
            .assign(date=lambda df: df.apply(row_to_date, axis=1))
            .groupby(by=['ip'])
            .apply(lambda g: g.diff()['date'].dt.total_seconds())
            .dropna()
            .to_frame('elapsed_seconds')
            .reset_index(level=1, drop=True)
    )
    df
    

    所以我得到:

         elapsed_seconds
    ip                  
    123          -8006.0
    326         -40496.0
    

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2021-08-26
      • 2014-09-21
      相关资源
      最近更新 更多