我正在尝试创建一个列表,其中包含从上午 9 点到下午 5 点每隔 30 分钟的选项。 例如
times = ['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00',
'12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00',
'15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']
如果不使用循环或看起来不那么冗长的方法,我如何才能完成此任务?
请您参考如下方法:
创建一个 datetime 对象的可迭代对象,从 9 点开始。
import datetime
fmt = '%H:%M'
start = datetime.datetime.strptime('09:00', fmt)
times = (start + datetime.timedelta(minutes=30*i) for i in range(17))
将 datetime 对象变回字符串。
times_str = (t.strftime(fmt) for t in times)
成对迭代 times_str。 itertools documentation有一个方法叫做 pairwise。您可以复制粘贴函数或从 more_itertools 导入它(需要安装)。
from more_itertools import pairwise
result = ['-'.join(times) for times in pairwise(times_str)]
输出:
>>> print(result)
['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00', '15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']
你可以用一个函数封装一切。
import datetime
from more_itertools import pairwise
def timepairs(start:datetime.datetime, steps:int, delta:datetime.timedelta, fmt='%H:%M'):
times = (start + delta*i for i in range(steps + 1))
times_str = (t.strftime(fmt) for t in times)
return ['-'.join(times) for times in pairwise(times_str)]
演示:
>>> start = datetime.datetime.strptime('09:00', '%H:%M')
>>> timepairs(start, 16, datetime.timedelta(minutes=30))
['09:00-09:30', '09:30-10:00', '10:00-10:30', '10:30-11:00', '11:00-11:30', '11:30-12:00', '12:00-12:30', '12:30-13:00', '13:00-13:30', '13:30-14:00', '14:00-14:30', '14:30-15:00', '15:00-15:30', '15:30-16:00', '16:00-16:30', '16:30-17:00']
>>>
>>> start = datetime.datetime.strptime('00:00', '%H:%M')
>>> timepairs(start, 12, datetime.timedelta(minutes=5))
['00:00-00:05', '00:05-00:10', '00:10-00:15', '00:15-00:20', '00:20-00:25', '00:25-00:30', '00:30-00:35', '00:35-00:40', '00:40-00:45', '00:45-00:50', '00:50-00:55', '00:55-01:00']
