Python - 生成时间差

2 投票
1 回答
1122 浏览
提问于 2025-04-16 06:54

我正在尝试生成一个使用统计报告。下面是我从Mysql表中获取的一个数组的示例数据。我的目标是实现一个逻辑:如果用户闲置超过30分钟,就认为他没有使用系统;否则,就计算用户的平均使用时间。

timestamp=[]
for i in timestamp:
   print i 

        2010-04-20 10:07:30
        2010-04-20 10:07:38
        2010-04-20 10:07:52
        2010-04-20 10:08:22
        2010-04-20 10:08:22
        2010-04-20 10:09:46
        2010-04-20 10:10:37
        2010-04-20 10:10:58
        2010-04-20 10:11:50
        2010-04-20 10:12:13
        2010-04-20 10:12:13
        2010-04-20 10:25:38
        2010-04-20 10:26:01
        2010-04-20 10:26:01
        2010-04-20 10:26:06
        2010-04-20 10:26:29
        2010-04-20 10:26:29
        2010-04-20 10:26:35
        2010-04-20 10:27:21
        2010-04-20 01:32:46
        2010-04-20 01:32:47
        2010-04-20 01:32:57
        2010-04-20 01:32:59
        2010-04-20 01:33:03
        2010-04-20 01:33:03
        2010-04-20 01:33:05
        2010-04-20 01:33:11
        2010-04-20 01:33:15
        2010-04-20 01:34:49
        2010-04-20 01:34:55
        2010-04-20 01:35:02
        2010-04-20 01:35:17
        2010-04-20 01:35:20
        2010-04-20 01:36:49
        2010-04-20 01:36:52
        2010-04-20 01:36:52
        2010-04-20 01:37:11
        2010-04-20 01:37:15
        2010-04-20 01:37:17
        2010-04-20 01:50:11
        2010-04-20 01:50:15
        2010-04-20 01:50:18
        2010-04-20 01:50:20
        2010-04-20 01:50:33
        2010-04-20 01:50:36
        2010-04-20 01:51:56

1 个回答

4

我觉得这就是你想要的。它会遍历这个列表,计算每个时间点和前一个时间点之间的差值。如果这个差值大于或等于30分钟,它就会忽略这个时间点。如果差值小于30分钟,它就会把这个时间加到那个用户的总使用时间里。(我假设所有的时间戳都是同一个用户的。)

from datetime import datetime,timedelta

# Convert the timestamps to datetime objects
usetimes = sorted(datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in timestamp)

# Set the idle time to compare with later
idletime = timedelta(minutes = 30)

# Start the running total with a timedelta of 0
usage = timedelta()
last = usetimes[0]

for d in usetimes[1:]:
    delta = d - last
    if delta < idletime:
        usage += delta
    last = d

print "total usage:",usage

如果你想用 sum()zip(),可以减少代码的行数,但我不确定这样是否更容易理解:

from datetime import datetime,timedelta
usetimes = sorted(datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in timestamp)
idletime = timedelta(minutes = 30)
usage = sum((x - y for x,y in zip(usetimes[1:],usetimes[:-1]) if x - y < idletime),timedelta())
print "total usage:", usage

在这种情况下,如果时间戳的列表很长,你可以考虑用 itertools 里的 izip 来替代 zip

撰写回答