You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:09:00