Rob*_*ein 5 python datetime time-series dataframe pandas
我正在努力完成一项明显简单的任务,希望在这里找到一些帮助!
我有类似以下数据框的内容。
d = [
['2021-06-01 08:00:00',"A"],
['2021-06-01 09:00:00',"A"],
['2021-06-01 12:00:00',"B"],
['2021-06-01 13:00:00',"B"],
['2021-06-01 18:00:00',"B"],
['2021-06-01 19:00:00',"B"],
['2021-06-01 22:00:00',"C"],
['2021-06-01 23:00:00',"C"]]
df=pd.DataFrame(data=d, columns=("timestamp", "session"))
Run Code Online (Sandbox Code Playgroud)
我想确定会话中大于阈值(例如 1 小时)的时间间隔。
为此目的,不应考虑会话之间的时间间隙,我使用.diff()方法来定位间隙。
df["timestamp"]= pd.to_datetime(df["timestamp"])
df["gap"]=df["timestamp"].diff().dt.seconds > 3600
Run Code Online (Sandbox Code Playgroud)
主要任务是找到会话中的间隙,并通过使用例如重命名部分/会话来将会话切成碎片uuid.uuid4()。
在该示例中,它将导致第 5/6 行出现新的会话名称。
我的方法是对独特会话进行迭代,但是当我在“间隙”列中找到True时,我无法重命名这些部分。
我想留在“熊猫世界”,因为这是一项大数据任务。
你可以做:
gap以下方法进行分组session.groupby()GroupBy.cumsum()获取group同一会话中的 id(新会话名称)(group每个时间间隔大于 1 小时的单独 id)GroupBy.transform()为每个组生成 uuid(每个会话有不同的 uuid,同一会话中每个间隙有单独的 uuid)import uuid
# Keep your existing codes:
df["timestamp"]= pd.to_datetime(df["timestamp"])
# Modify your existing codes:
#df["gap"] = df["timestamp"].diff().dt.seconds > 3600
df["gap"] = df.groupby('session')["timestamp"].diff().dt.seconds > 3600
# New codes:
df['group'] = df.groupby('session')['gap'].cumsum()
df['session_gap_id'] = df.groupby(['session', 'group'], as_index=False)['group'].transform(lambda x: uuid.uuid4())
Run Code Online (Sandbox Code Playgroud)
结果:
在这里,每个会话都有不同的会话名称,并且会话中的每个不同组也是独立的,包括行 5/6(行索引 4/5)session_gap_idsessionsession_gap_id
print(df)
timestamp session gap group session_gap_id
0 2021-06-01 08:00:00 A False 0 3cca414b-6bbf-4474-92c4-a0c8273955d8
1 2021-06-01 09:00:00 A False 0 3cca414b-6bbf-4474-92c4-a0c8273955d8
2 2021-06-01 12:00:00 B False 0 9c86305e-fcd6-42c8-b532-39d342a3b35c
3 2021-06-01 13:00:00 B False 0 9c86305e-fcd6-42c8-b532-39d342a3b35c
4 2021-06-01 18:00:00 B True 1 0dbcf66c-ce0d-4b01-93e2-978d77348235
5 2021-06-01 19:00:00 B False 1 0dbcf66c-ce0d-4b01-93e2-978d77348235
6 2021-06-01 22:00:00 C False 0 9b31532c-55c0-4a66-8719-1edbb9047fba
7 2021-06-01 23:00:00 C False 0 9b31532c-55c0-4a66-8719-1edbb9047fba
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |