如何使用间隔基于时间删除相同的值?

Mic*_*khi 5 python datetime dataframe pandas

我有一个数据集,如下所示:

Name |        Time     |   App 
---------------------------------
Mike  2019-05-10 21:10 chrome.exe
Mike  2019-05-10 21:10 chrome.exe
Mike  2019-05-10 21:12 chrome.exe
John  2019-05-10 18:09 chrome.exe
John  2019-05-10 18:25 chrome.exe
Run Code Online (Sandbox Code Playgroud)

我的目标是:我想基于同一时间或每隔5分钟为每个用户组合相同的应用程序,并且仅保存最早的时间戳。

预期产量:

Name |        Time     |   App 
---------------------------------
Mike  2019-05-10 21:10 chrome.exe
John  2019-05-10 18:09 chrome.exe
John  2019-05-10 18:25 chrome.exe
Run Code Online (Sandbox Code Playgroud)

迈克跑了chrome.exe3次,但间隔小于等于5,所以我们想算一次。虽然John跑了chrome.exe2次但间隔> 5分钟,所以它们算作单独的跑步。我试过了mergemerge_asofpd.timedelta

lis*_*isu 3

让我们首先创建示例数据框(与您的有点不同):

data = [('2019-01-01 13:00','John', 'Chrome'),('2019-01-01 13:02','John', 'Chrome'),('2019-01-01 13:06','John', 'Chrome'),('2019-01-01 13:00','Mike', 'Chrome'),('2019-01-01 13:02','Mike', 'Chrome'), ('2019-01-01 13:06','John', 'Chrome')]
df = pd.DataFrame(data, columns =['Time','Name','App'])
Run Code Online (Sandbox Code Playgroud)

您需要时间作为数据框中的索引。您可以通过以下方式实现这一目标:

df.index = pd.to_datetime(df['Time'])
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作:

df.groupby(['Name', 'App', pd.Grouper(freq='5T')]).min() #5T here means 5 minutes
Run Code Online (Sandbox Code Playgroud)

(请注意,这将以五分钟间隔进行分组,从整点开始,这意味着就该解决方案而言,13:04 和 13:06 是两个不同的事件)。您可以通过http://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html查找不同的频率进行分组

结果:

Name  App     Time               
John  Chrome  2019-01-01 13:00:00    2019-01-01 13:00
              2019-01-01 13:05:00    2019-01-01 13:06
Mike  Chrome  2019-01-01 13:00:00    2019-01-01 13:00
Run Code Online (Sandbox Code Playgroud)

第二次是您感兴趣的时间。结果是 pd.Series,您可能希望将其设为数据框或 apply .unstack(level=1)

正如评论中指出的那样,您可能不一定希望将 Time 既作为索引又作为新列,那么df.index = pd.to_datetime(df.Time)您可能想要这样做:

df.set_index('Time', inplace=True)
Run Code Online (Sandbox Code Playgroud)