【问题标题】:Pandas: Find time patterns熊猫:寻找时间模式
【发布时间】:2021-05-01 01:20:25
【问题描述】:

我有一个包含两列的数据框。一列是 ID,一列是时间戳,以微秒为单位。

我想识别在给定时间段内出现超过 n 次的每个 id。假设我想识别在 5 分钟内出现至少 100 次的每个 id。 我的代码可以工作,但速度很慢,而且看起来相当复杂而不是熊猫:

def getInfoDict(ip, start, end, num):
    return {
    'ip': ip,
    'start': start,
    'end': end,
    'num': num    
}

dtypes = {'ip.src': 'str','frame.time_epoch': 'str'}
df = pd.read_csv(path, header=None, usecols=[0,9], names=['ip.src','frame.time_epoch'], dtype=dtypes)
df['frame.time_epoch'] =  pd.to_datetime(df['frame.time_epoch'],unit='s')

result = []
timeout = pd.Timedelta(value=300,unit='s')
for ip in df['ip.src'].unique():
    subset = df[df['ip.src'] == ip]
    if len(subset) > 49:
        start = 0
        counter = 0
        for index, row in subset.iterrows():
            if start == 0 or pd.Timedelta(row['frame.time_epoch'] - start).microseconds > 300000000:
                start = row['frame.time_epoch']
                counter = 1
                continue
            counter = counter + 1
            end = row['frame.time_epoch']
        if counter > 99:
            result.append(getInfoDict(ip, start, end, counter))
                
df = pd.DataFrame(result)
df.to_csv("result.csv", index=False)

有什么更好的方法来做到这一点?我一直在研究熊猫系列,但我不知道该怎么做。

【问题讨论】:

  • 你可以通过df['tag'] = df['frame.time_epoch'].astype(float)//300在frame.time_epoch上创建一个5分钟的组,然后df.groupby(['tag', 'ip.src']).size()找到每5分钟的范围,哪个ip出现的次数超过了给定的次数。

标签: python pandas performance time


【解决方案1】:

您可以在 4 行中完成此操作。

groups = df.groupby(['id'])
for name, group in groups:
    if (group['time'].diff(periods=499) < 300000).any():
        print(name)

解释

假设您的数据框 df 包含 2 列:idtime。首先,将数据框按id 分组。查看 this link 获取 pandas groupby。

由于我们已按 id 分组,因此每个组将有一个 id 和所有出现 idtime 值。

我们遍历组并在时间列上执行diffperiods=499。这意味着我们做500th timestamp - 1st timestamp501st timestamp - 2nd timestamp 等等。 (前 500 个值将是 NaN)。查看 this 链接了解 pandas diff 方法。

我们检查是否有任何差异小于 5 分钟 (&lt; 300000)。如果那是真的,那么在不到 5 分钟的时间内至少发生了 500 次不同的事件。

最后,如果检查为真,我们打印名称(即id)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多