Python - 生成时间差
我正在尝试生成一个使用统计报告。下面是我从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
。