Python 2:比较两个时间点之间的时间戳

时间:2018-05-17 20:52:15

标签: python python-datetime

对于我的脚本,我需要使用只有标准库的Python 2.6。我正在尝试编写一个脚本,该脚本遍历一个日志目录,该目录的条件定义只匹配具有适当时间戳的日志。我使用的时间戳是从文件名派生的。我不想使用操作系统时间戳,因为有时文件会被复制到另一个目录以防止它们被覆盖,这会改变文件修改时间。

每200MB创建一个新文件。文件名的时间戳是文件创建的时间,表示文件中最旧的日志条目。

import datetime

# One event might span multiple log files.
call_start = datetime.datetime(2018, 5, 15, 5, 25, 9)
call_stop = datetime.datetime(2018, 5, 15, 5, 37, 38)

# Timestamp values of file generated from file's naming convention
t1 = datetime.datetime(2018, 5, 15, 4, 48, 16)
t2 = datetime.datetime(2018, 5, 15, 5, 3, 53)
t3 = datetime.datetime(2018, 5, 15, 5, 19, 14)
t4 = datetime.datetime(2018, 5, 15, 5, 35)
t5 = datetime.datetime(2018, 5, 15, 5, 49, 19)

file_times = [t1, t2, t3, t4, t5]

matching_times = []
for ftime in file_times:
    # Logic I can't figure out
    if scratches_head:
        matching_times.append(ftime)

# I would expect the matching_times list to contain t3 and t4

修改

来自comments

的澄清

t3是在5:19:14am创建的文件。 call_start是我在日志中看到的第一个条目。它始于5:25:09am。由于在t4之前5:35:00am尚未创建,call_start必须位于t3call_stop是我想要查找的最后一个日志条目。我会在t4,因为t5是在5:49:19am创建的。

1 个答案:

答案 0 :(得分:1)

一种方法是enumerate()覆盖列表中的项目,并从每对连续的时间创建范围。然后检查这些ranges overlap是否包含(call_start, call_end)。如果范围重叠,请将范围的开头附加到列表中。您还必须在列表中最后一次包含特殊检查。

例如:

for i, ftime in enumerate(file_times):
    if i+1 >= len(file_times):
        # last item in list, add if it's less than call_stop
        scratches_head = ftime < call_stop
    else:
        # check if ranges overlap
        fstart = ftime
        fend = file_times[i+1]
        scratches_head = (fstart <= call_stop) and (fend >= call_start)

    if scratches_head:
        matching_times.append(ftime)

print([datetime.datetime.strftime(x, "%Y-%m-%d %H:%M:%S") for x in matching_times])
#['2018-05-15 05:19:14', '2018-05-15 05:35:00']