【问题标题】:Python 2: Compare a timestamp between two points in timePython 2:比较两个时间点之间的时间戳
【发布时间】:2018-05-17 20:52:14
【问题描述】:

对于我的脚本,我只需要使用带有标准库的 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 必须在t3 中。 call_stop 是我要查找的最后一个日志条目。我会在t4,因为t5 是在5:49:19am 创建的。

【问题讨论】:

  • 为什么 t3 和 t4 会匹配?你想匹配什么?
  • 对不起,我不明白逻辑。您想查找发生在call_start 和call_stop 之间的时间戳吗?如果是这样,我不明白为什么 t3 这里有资格。见:How to determine if a timestamp is within a specific range
  • 无论你的规则是什么,只要写下比较就可以了。例如,if call_start <= ftime < call_stop: 会告诉你ftime 是否在call_start 和call_stop 之间,就像2 <= n < 5 会告诉你n 是否在2 和5 之间。如果你想要一个封闭的范围对于半开范围,将< 更改为<=。等等。 (当然,我能想到的所有合理规则都只会通过t4,但 pault 已经涵盖了这一点。)
  • t3 是在上午 5:19:14 创建的文件。 call_start 是我在日志中看到的第一个条目。它从早上 5:25:09 开始。由于 t4 直到凌晨 5:35:00 才创建,所以 call_start 必须在 t3 中。 call_stop 是我要查找的最后一个日志条目。我会在 t4,因为 t5 是在上午 5:49:19 创建的。
  • 好的,所以把这个逻辑变成代码:每当file_times[i] > call_start 但file_times[i-1] >= call_start,你想要file_times[i-1]?

标签: python python-datetime


【解决方案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']

【讨论】:

  • 我试过实现这个。在示例中它可以工作,但是当我针对大量文件运行它时,它匹配不正确。如果我做 sorted(file_times),我也可以改变它的匹配行为。
  • @JeffA file_times 在这个例子中已经排序——事实上,这是这个方法工作的必要条件。它假设连续的条目形成一个范围 - 这仅在时间排序时才有效。你能edit你的问题并添加一个不起作用的例子吗?
  • 一切似乎都运行良好。排序是使这一切正常工作的关键。当我第一次测试排序时,我大多数都没有正确地做某事或误解了结果。感谢您的帮助。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2017-07-10
相关资源
最近更新 更多