如何解决计算时间间隔以在熊猫数据框中形成新列
我有100,000行数据,格式如下:
import pandas as pd
data = {'ID': [1,1,3,4,4],'timestamp': ['12/23/14 16:53','12/23/14 17:00','12/23/14 17:01','12/23/14 17:02','12/23/14 17:06','12/23/14 17:15','12/23/14 17:16','12/23/14 17:20']}
df = pd.DataFrame(data)
ID timestamp
0 1 2014-12-23 16:53:00
1 1 2014-12-23 17:00:00
2 3 2014-12-23 17:01:00
3 3 2014-12-23 17:02:00
4 4 2014-12-23 17:00:00
5 3 2014-12-23 17:06:00
6 4 2014-12-23 17:15:00
7 4 2014-12-23 17:16:00
8 4 2014-12-23 17:20:00
ID
代表用户,timestamp
代表该用户访问网站的时间。我想获取有关使用熊猫进行的会话的信息,该站点上的每次会话最长不超过15分钟。用户登录15分钟后,将开始新的会话。对于上述示例数据,期望的结果将是:
ID session_start session_duration
0 1 12/23/14 16:53. 7 min
1 3 12/23/14 17:02. 4 min
2 4 12/23/14 17:00. 15 min
3 4 12/23/14 17:16. 4 min
让我知道是否有需要补充的信息。我似乎找不到有效的解决方案。任何帮助表示赞赏!
编辑:在回答以下查询时,我在示例中注意到一个错误。抱歉,晚上很晚了!
我正在努力解决的问题主要与用户4有关。他们在15分钟后仍处于登录状态,我想从我的数据中捕获新会话已开始。
我的问题与此Groupby every 2 hours data of a dataframe略有不同的原因是,我想根据个人用户进行此操作。
解决方法
不好看,但这是一个解决方案。基本思想是将groupby
与diff
一起使用,以计算每个ID
的时间戳之间的差异,但是我找不到找到仅对每两行进行比较的好方法。因此,这种方法对每一行都使用diff
,然后在每个ID
中彼此选择比较结果。
请注意,我假设数据帧已正确排序。另外请注意,您的示例数据中有一个我删除的ID==1
的额外条目。
import pandas as pd
data = {'ID': [1,1,3,4,4],'timestamp': ['12/23/14 16:53','12/23/14 17:00','12/23/14 17:02','12/23/14 17:06','12/23/14 17:15','12/23/14 17:16','12/23/14 17:20']}
df = pd.DataFrame(data)
df['timestamp']=pd.to_datetime(df['timestamp'])
# groupby to get difference between each timestamp
df['diffs'] = df.groupby('ID')['timestamp'].diff()
# count every time ID appears
df['counts'] = df.groupby('ID')['ID'].cumcount()+1
print("after diffs and counts:")
print(df)
# select entries for every 2nd occurence (where df['counts'] is even)
new_df = df[df['counts'] % 2 == 0][['ID','timestamp','diffs']]
# timestamp here will be the session endtime so subtract the
# diffs to get session start time
new_df['timestamp'] = new_df['timestamp'] - new_df['diffs']
# and a final rename
new_df = new_df.rename(columns={'timestamp':'session_start','diffs':'session_duration'})
print("\nfinal df:")
print(new_df)
将打印出
after diffs and counts:
ID timestamp diffs counts
0 1 2014-12-23 16:53:00 NaT 1
1 1 2014-12-23 17:00:00 0 days 00:07:00 2
2 3 2014-12-23 17:02:00 NaT 1
3 4 2014-12-23 17:00:00 NaT 1
4 3 2014-12-23 17:06:00 0 days 00:04:00 2
5 4 2014-12-23 17:15:00 0 days 00:15:00 2
6 4 2014-12-23 17:16:00 0 days 00:01:00 3
7 4 2014-12-23 17:20:00 0 days 00:04:00 4
final df:
ID session_start session_duration
1 1 2014-12-23 16:53:00 0 days 00:07:00
4 3 2014-12-23 17:02:00 0 days 00:04:00
5 4 2014-12-23 17:00:00 0 days 00:15:00
7 4 2014-12-23 17:16:00 0 days 00:04:00
然后获取分钟数来代替session_duration
对象的timedelta
列,您可以执行以下操作:
import numpy as np
new_df['session_duration'] = new_df['session_duration'] / np.timedelta64(1,'s') / 60.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。