跳转到主要内容

Python的时间跨度和服务程序助手

项目描述

>>> import datetime
>>> from timelines import timespan, timelayer

时间跨度对象有一个开始时间和一个结束时间。它可以通过指定开始时间和经过时间或指定开始和结束时间来创建

>>> span1 = timespan(datetime.datetime(1984, 11, 26), datetime.timedelta(1))
>>> span2 = timespan(datetime.datetime(1984, 11, 26) + datetime.timedelta(2), datetime.datetime(1984, 11, 26) + datetime.timedelta(2, 50))
>>> span1.start
datetime.datetime(1984, 11, 26, 0, 0)
>>> span1.elapsed
datetime.timedelta(1)

时间跨度的经过时间是它的开始时间和结束时间之间的timedelta

>>> span1.elapsed == span1.end - span1.start
True

时间层对象是一系列有序的非重叠时间跨度,它们知道它们发生的顺序

>>> layer = timelayer(span2, span1)
>>> list(layer) == [span1, span2]
True

就像时间跨度一样,时间层知道自己的开始和结束时间

>>> layer.start == span1.start
True
>>> layer.end == span2.end
True

时间层的经过持续时间是其包含的时间跨度的经过持续时间的总和,而不是它的开始和结束时间之间的delta

>>> layer.elapsed == span1.elapsed + span2.elapsed
True
>>> layer.elapsed == layer.end - layer.start
False

您可以向时间层添加新的时间跨度

>>> layer.start
datetime.datetime(1984, 11, 26, 0, 0)
>>> layer.end
datetime.datetime(1984, 11, 28, 0, 0, 50)
>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(1), datetime.timedelta(0, 600)))
>>> layer.start
datetime.datetime(1984, 11, 25, 0, 0)
>>> layer.end
datetime.datetime(1984, 11, 28, 0, 0, 50)

但是,您不能添加与新时间跨度重叠的现有时间跨度

>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(2), datetime.timedelta(2)))
Traceback (most recent call last):
...
RuntimeError: <timelayer datetime.datetime(1984, 11, 24, 0, 0) => datetime.datetime(1984, 11, 26, 0, 0) (contains 1 timespans)> overlaps <timespan datetime.datetime(1984, 11, 25, 0, 0) => datetime.datetime(1984, 11, 25, 0, 10)>
>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(1) + datetime.timedelta(0, 300), datetime.timedelta(0, 600)))
Traceback (most recent call last):
...
RuntimeError: <timelayer datetime.datetime(1984, 11, 25, 0, 5) => datetime.datetime(1984, 11, 25, 0, 15) (contains 1 timespans)> overlaps <timespan datetime.datetime(1984, 11, 25, 0, 0) => datetime.datetime(1984, 11, 25, 0, 10)>
>>> layer.add(timespan(datetime.datetime(1984, 11, 26) + datetime.timedelta(0, 300), datetime.timedelta(0, 1200)))
Traceback (most recent call last):
...
RuntimeError: <timelayer datetime.datetime(1984, 11, 26, 0, 5) => datetime.datetime(1984, 11, 26, 0, 25) (contains 1 timespans)> overlaps <timespan datetime.datetime(1984, 11, 26, 0, 0) => datetime.datetime(1984, 11, 27, 0, 0)>

您还可以向时间层添加约束。约束允许您冻结时间层的开始时间或结束时间,或者对层的总经过时间设置上限。如果新的时间跨度未能通过其约束,则不能将其添加到层中

>>> layer.freeze_start()
>>> layer.add(timespan(datetime.datetime(1984, 11, 26) - datetime.timedelta(4), datetime.timedelta(2)))
Traceback (most recent call last):
...
RuntimeError: datetime.datetime(1984, 11, 22, 0, 0) is earlier than frozen start datetime.datetime(1984, 11, 25, 0, 0)
>>> layer.freeze_elapsed(datetime.timedelta(3))
>>> layer.add(timespan(datetime.datetime(1985, 11, 26), datetime.datetime(1985, 11, 29)))
Traceback (most recent call last):
...
RuntimeError: Total elapsed time datetime.timedelta(4, 650) is greater than frozen allowed elapsed time datetime.timedelta(3)
>>> layer.freeze_end(datetime.datetime(1985, 11, 27))
>>> layer.add(timespan(datetime.datetime(1985, 11, 26, 23), datetime.datetime(1985, 11, 27, 1)))
Traceback (most recent call last):
...
RuntimeError: datetime.datetime(1985, 11, 27, 1, 0) is later than frozen end datetime.datetime(1985, 11, 27, 0, 0)

变更日志

0.2 (2012-06-15)

  • 实现timelayer.freeze_elapsed约束,允许用户将层的总允许经过时间限制为给定的timedelta

  • 通过实现timespan.__cmp___修复timelayers的有保证排序问题

  • 通过独立检查现有层中的每个时间跨度的冲突,而不是只检查层边界,修复timelayer.add中的碰撞检测问题

  • timelayer.add期间的异常现在提供了更多有关操作失败原因的信息

0.1 (2012-06-13)

  • 初始发布,一切皆新!

由以下支持