我有两个约会,就像:
date_a = datetime.datetime(2016, 8, 9, 8, 24, 30, 993352)
date_b = datetime.datetime(2016, 8, 9, 7, 24, 30, 993352)
我想要的是在这两个日期之间以5分钟的间隔获得时间戳列表。使用上述两个日期,结果将是:
five_min_timestamps = [
datetime.datetime(2016, 8, 9, 7, 25, 0, 0)
datetime.datetime(2016, 8, 9, 7, 30, 0, 0)
datetime.datetime(2016, 8, 9, 7, 35, 0, 0)
datetime.datetime(2016, 8, 9, 7, 45, 0, 0)
datetime.datetime(2016, 8, 9, 7, 55, 0, 0)
datetime.datetime(2016, 8, 9, 8, 00, 0, 0)
datetime.datetime(2016, 8, 9, 8, 05, 0, 0)
datetime.datetime(2016, 8, 9, 8, 10, 0, 0)
datetime.datetime(2016, 8, 9, 8, 15, 0, 0)
datetime.datetime(2016, 8, 9, 8, 20, 0, 0)
]
我仍然在努力弄清楚如何实现一个函数(非常python),就像上面的描述一样,输出时间戳。
要求这两个日期(date_a和date_b)之间的范围大于或小于该示例。因此,获取一天甚至一周之间的间隔应该包含在该函数中。
不是非常python化,但简洁明了:
from datetime import timedelta
delta = timedelta(minutes=5)
five_min_timestamps = []
date_x = date_a
while date_x < date_b:
date_x += timedelta(minutes=5)
five_min_timestamps.append(date_x)
另一个选项是使用列表推导式:
intervals = divmod((date_b - date_a).total_seconds(), 300)
five_min_timestamps = [date_a + i * datetime.timedelta(minutes=5) for i in range(intervals)]
intervals
变量告诉您,在这个时间范围内您需要多少个间隔(除以300的日期之间的差)。
或者用一个语句:
five_min_timestamps = [
date_a + i * datetime.timedelta(minutes=5)
for i in range(
divmod((date_b - date_a).total_seconds(), 300))]
您还可以从dateutil
中查看使用rrule
模块:
示例:rrule模块提供了一个小的、完整的、非常快速的、在iCalendar中记录的递归规则的实现RFC,包括对缓存结果的支持。
>>> import datetime
>>>
>>> date_a = datetime.datetime(2016, 8, 9, 8, 24, 30, 993352)
>>> date_b = datetime.datetime(2016, 8, 9, 7, 24, 30, 993352)
>>>
>>> from dateutil import rrule
>>>
>>> list(rrule.rrule(rrule.MINUTELY, interval=5, dtstart=date_b + datetime.timedelta(minutes=1), until=date_a))
[
datetime.datetime(2016, 8, 9, 7, 25, 30),
datetime.datetime(2016, 8, 9, 7, 30, 30),
datetime.datetime(2016, 8, 9, 7, 35, 30),
datetime.datetime(2016, 8, 9, 7, 40, 30),
datetime.datetime(2016, 8, 9, 7, 45, 30),
datetime.datetime(2016, 8, 9, 7, 50, 30),
datetime.datetime(2016, 8, 9, 7, 55, 30),
datetime.datetime(2016, 8, 9, 8, 0, 30),
datetime.datetime(2016, 8, 9, 8, 5, 30),
datetime.datetime(2016, 8, 9, 8, 10, 30),
datetime.datetime(2016, 8, 9, 8, 15, 30),
datetime.datetime(2016, 8, 9, 8, 20, 30)
]
还有一个经常被忽视的Delorean
库,它可以"停几站"。
定义一个返回低时间a
和高时间b
之间的间隔列表的函数。
def print_time(a, b, inter):
tmp = a + datetime.timedelta(0,interval) # sum an interval of inter secs
list = []
while tmp < b:
list.add(tmp)
tmp = tmp + datetime.timedelta(0,interval) # sum the interval again
return list
结果列表的日期时间以秒为间隔。
Toby Speight建议的Yield版本:
def print_time(a, b, inter):
tmp = a + datetime.timedelta(0,interval) # sum an interval of inter secs
while tmp < b:
yield tmp
tmp = tmp + datetime.timedelta(0,interval) # sum the interval again