pandas如何调整datetime列时间并统计8:00至24:00区间用户在线时长
实现思路
pandas的datetime类型列可以直接通过.dt.hour属性提取小时数做条件判断,也可以用.dt.time提取纯时间对象做更细粒度的时间区间判断,整体实现逻辑如下:
- 先确保登录、登出列已转为datetime类型
- 对登录时间做截断:如果登录时间在0:00-8:00区间,统一替换为当日8:00
- 对登出时间做截断:如果登出时间在0:00-8:00区间,统一替换为当日0:00
- 最后计算有效时长时过滤掉负时长的无效记录即可
完整可运行代码示例
import pandas as pd # 示例数据构造 df = pd.DataFrame({ 'login_time': [ '2024-05-20 07:30:00', '2024-05-20 09:15:00', '2024-05-20 23:20:00' ], 'logout_time': [ '2024-05-20 09:45:00', '2024-05-20 06:20:00', '2024-05-21 02:10:00' ] }) # 转换为datetime类型,非标准格式数据可加format参数指定格式 df[['login_time', 'logout_time']] = df[['login_time', 'logout_time']].apply(pd.to_datetime) # 处理登录时间:0-8点登录的统一调整为当日8点 df['adjusted_login'] = df['login_time'].where( df['login_time'].dt.hour >= 8, df['login_time'].dt.floor('D') + pd.Timedelta(hours=8) ) # 处理登出时间:0-8点登出的统一调整为当日0点 df['adjusted_logout'] = df['logout_time'].where( df['logout_time'].dt.hour >= 8, df['logout_time'].dt.floor('D') ) # 计算有效在线时长,单位为分钟,负时长直接置为0 df['online_duration_min'] = (df['adjusted_logout'] - df['adjusted_login']).dt.total_seconds().div(60).clip(lower=0)
关键逻辑说明
.dt.floor('D')用于取当前时间对应的当日0点时间戳,加8小时的时间差即可得到当日8点where函数的执行效率远高于逐行apply,适合百万级以上的大数据量场景- 最终用
clip(lower=0)处理无效记录:比如原本登录登出都在0-8点区间,调整后登录是8点、登出是0点,时长为负,直接置为0即可,不会影响后续统计结果
内容的提问来源于stack exchange,提问作者Brit
相关产品推荐
相关产品推荐

