python - 使用循环而不是手动输入创建时间列表
问题描述
我正在尝试从上午 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
文档有一个名为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']
推荐阅读
- javascript - protobuf 中的错误 | npm 错误!代码 ELIFECYCLE :: 在 Ubuntu 16.04 中设置 Sawtooth JavaScript 事务处理器时
- android - 如何暂停活动
- sybase - 无法执行语句。无法打开与站点“SYB_BACKUP”的连接。查看 ASE 引导目录中的错误日志文件
- ubuntu - 在 Ubuntu 上对 Redis 4.0.10 进行测试失败
- javascript - 为附加了 AJAX 的 div 创建一个滑块
- c# - 从 Json API 对变量进行更新检查
- jmeter - 带有 Jmeter 的“HtmlUnit”驱动程序在 javascript 中显示错误
- python - 如何使用python检查鼠标的系统设置是否是左撇子?
- ios - 添加导航栏但没有返回按钮
- django - Django:将 OneToOneField 更改为 ForeignKey 最终以 'User' 对象没有属性 'profile'