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

时间:2016-08-09 08:35:06

标签: python datetime

我有两个约会,就像:

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)之间的范围将大于或小于该示例中的范围。因此,该功能应涵盖一整天甚至一周之间的间隔。

3 个答案:

答案 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