Python 中的无限时间增量
Infinite Timedelta in Python
如何在 Python 中表达无限时间增量?
到目前为止,我们使用 stdlib 中的 datetime
,但如果仅在第三方库中受支持,我们可以切换。
PostgreSQL 支持它。这对我来说很方便。我想用它来表示一个未完成的区间。
我可以使用 None
,但是无限时间增量可以避免很多情况(if
语句)。
我发现了这个:http://initd.org/psycopg/docs/usage.html#infinite-dates-handling
PostgreSQL can store the representation of an “infinite” date,
timestamp, or interval. Infinite dates are not available to Python, so
these objects are mapped to date.max, datetime.max, interval.max.
Unfortunately the mapping cannot be bidirectional so these dates will
be stored back into the database with their values, such as
9999-12-31.
简答:不支持。
表示未完成间隔的典型方法是使用日期时间类型的最大值或 NULL
作为结束时间。
如图所示,您无法真正执行涉及无限值的计算并获得有意义的结果。
因此,NULL
在这方面更好,只是不允许您这样做。
一个 "unfinished interval" 可以用 datetime
表示(并且可能子 class 它包含一个标志说明 start
或 end
)-就是这样我会做一个快速实施。
当你有间隔的相应结束或开始时),使用它们的差异得到 timedelta
:
>>> from datetime import datetime, timedelta
# represent infinite time from 1/1/2014 onwards
>>> start = datetime(2014, 1, 1)
# stop that time
>>> end = datetime(2015, 1, 1)
>>> interval = end - start
>>> interval
datetime.timedelta(365)
如果你有时间这样做 "the right way" 你可以创建一个特殊的 timedelta
-like class 有两个 datetime
对象(开始和结束)。如果其中一个缺失,您可以假设它是一个无限的时间增量并这样对待它。
示例:
from datetime import timedelta, datetime
class SpecialTimedelta(object):
def __init__(self, start=None, end=None):
self.start = start
self.end = end
if start and not isinstance(start, datetime):
raise TypeError("start has to be of type datetime.datetime")
if end and not isinstance(start, datetime):
raise TypeError("end has to be of type datetime.datetime")
def timedelta(self):
if not (self.start and self.end):
# possibly split cases
return "infinite"
# alternatives:
# return self.start or self.end
# raise OverflowError("Cannot quantiate infinite time with timedelta")
return self.end - self.start
print SpecialTimedelta(datetime(1986, 1, 1), datetime(2015, 1, 1)).timedelta()
# out: 10592 days, 0:00:00
print SpecialTimedelta(datetime(1986, 1, 1)).timedelta()
# out: infinite
如何在 Python 中表达无限时间增量?
到目前为止,我们使用 stdlib 中的 datetime
,但如果仅在第三方库中受支持,我们可以切换。
PostgreSQL 支持它。这对我来说很方便。我想用它来表示一个未完成的区间。
我可以使用 None
,但是无限时间增量可以避免很多情况(if
语句)。
我发现了这个:http://initd.org/psycopg/docs/usage.html#infinite-dates-handling
PostgreSQL can store the representation of an “infinite” date, timestamp, or interval. Infinite dates are not available to Python, so these objects are mapped to date.max, datetime.max, interval.max. Unfortunately the mapping cannot be bidirectional so these dates will be stored back into the database with their values, such as 9999-12-31.
简答:不支持。
表示未完成间隔的典型方法是使用日期时间类型的最大值或 NULL
作为结束时间。
如图所示,您无法真正执行涉及无限值的计算并获得有意义的结果。
因此,NULL
在这方面更好,只是不允许您这样做。
一个 "unfinished interval" 可以用 datetime
表示(并且可能子 class 它包含一个标志说明 start
或 end
)-就是这样我会做一个快速实施。
当你有间隔的相应结束或开始时),使用它们的差异得到 timedelta
:
>>> from datetime import datetime, timedelta
# represent infinite time from 1/1/2014 onwards
>>> start = datetime(2014, 1, 1)
# stop that time
>>> end = datetime(2015, 1, 1)
>>> interval = end - start
>>> interval
datetime.timedelta(365)
如果你有时间这样做 "the right way" 你可以创建一个特殊的 timedelta
-like class 有两个 datetime
对象(开始和结束)。如果其中一个缺失,您可以假设它是一个无限的时间增量并这样对待它。
示例:
from datetime import timedelta, datetime
class SpecialTimedelta(object):
def __init__(self, start=None, end=None):
self.start = start
self.end = end
if start and not isinstance(start, datetime):
raise TypeError("start has to be of type datetime.datetime")
if end and not isinstance(start, datetime):
raise TypeError("end has to be of type datetime.datetime")
def timedelta(self):
if not (self.start and self.end):
# possibly split cases
return "infinite"
# alternatives:
# return self.start or self.end
# raise OverflowError("Cannot quantiate infinite time with timedelta")
return self.end - self.start
print SpecialTimedelta(datetime(1986, 1, 1), datetime(2015, 1, 1)).timedelta()
# out: 10592 days, 0:00:00
print SpecialTimedelta(datetime(1986, 1, 1)).timedelta()
# out: infinite