【发布时间】:2021-11-22 06:00:08
【问题描述】:
我正在尝试编写一个可以灵活创建连续日期时间对象的函数,类似于标准range() 函数或numpy linspace() 函数。
该函数应该能够接受num 参数或step 大小参数来确定序列。此外,应该有包括或排除起点和终点的选项。
因此,函数的签名应该是这样的:
import datetime as dt
def datetime_range(start: dt.datetime, stop: dt.datetime, step: dt.timedelta = None, num: int = None, startpoint=True, endpoint=True)
所需的输出应如下所示:
start = dt.datetime.min
stop = start + dt.timedelta(days=1)
num = 4
>>> datetime_range(start, end, num=num, startpoint=True, endpoint=True)
>>> [datetime.datetime(1, 1, 1, 0, 0), datetime.datetime(1, 1, 1, 8, 0), datetime.datetime(1, 1, 1, 16, 0), datetime.datetime(1, 1, 2, 0, 0)]
>>> datetime_range(start, end, num=num, startpoint=False, endpoint=True)
>>> [datetime.datetime(1, 1, 1, 6, 0), datetime.datetime(1, 1, 1, 12, 0), datetime.datetime(1, 1, 1, 18, 0), datetime.datetime(1, 1, 2, 0, 0)]
>>> datetime_range(start, end, num=num, startpoint=True, endpoint=False)
>>> [datetime.datetime(1, 1, 1, 0, 0), datetime.datetime(1, 1, 1, 6, 0), datetime.datetime(1, 1, 1, 12, 0), datetime.datetime(1, 1, 1, 18, 0)]
>>> datetime_range(start, end, num=num, startpoint=False, endpoint=False)
>>> [datetime.datetime(1, 1, 1, 4, 48), datetime.datetime(1, 1, 1, 9, 36), datetime.datetime(1, 1, 1, 14, 24), datetime.datetime(1, 1, 1, 19, 12)]
到目前为止,我想出的内容如下。但它没有按预期工作,我被卡住了。
def datetime_range(start: dt.datetime, stop: dt.datetime, step: dt.timedelta = None, num: int = None, startpoint=True,endpoint=True):
assert bool(step) != bool(num), f'only one of step or num must be given'
delta = stop - start
if bool(num):
if endpoint and startpoint:
div = num - 1
elif endpoint != startpoint:
div = num
else:
div = num + 1
step = delta / div
else:
if endpoint and startpoint:
div = delta / step
elif endpoint != startpoint:
div = (end - step) / step # or (delta / step) - 1
else:
div = (end - 2 * step) / step # or (delta/step) -2
return ((start + (not startpoint) * step) + x * step for x in range(div))
我正在使用 Python 3.8。也许有人可以给我提示。另外,我怀疑计算div 的方法可能比使用if, elif, else 更优雅。非常感谢任何帮助!
【问题讨论】:
-
你能详细说明使用的算法吗?
-
看看这个,我很确定它可以满足你的一切需求。 pandas.pydata.org/docs/reference/api/pandas.date_range.html