我有两个约会,就像:
date_a = datetime.datetime(2016, 8, 9, 8, 24, 30, 993352)
date_b = datetime.datetime(2016, 8, 9, 7, 24, 30, 993352)
我想要的是获取一个时间戳列表,其间隔五分钟,介于这两个日期之间。有了上述两个日期,结果将是:
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)
]
我仍在试图弄清楚如何实现一个函数(非常pythonic),它可以像上面的描述一样输出时间戳。
要求是这两个日期(date_a和date_b)之间的范围将大于或小于该示例中的范围。因此,该功能应涵盖一整天甚至一周之间的间隔。
答案 0 :(得分:3)
不是非常pythonic,但干净简洁:
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))]
答案 1 :(得分:2)
您还可以查看使用rrule
module from dateutil
:
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
library can make "a few stops"。
答案 2 :(得分:0)
定义一个函数,该函数返回低时间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建议的收益率版本:
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