如何将python datetime-span划分为等间隔的时间间隔



我有两个约会,就像:

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

相关内容

  • 没有找到相关文章

最新更新