2016-08-09 46 views
0

我有兩個日期,就像:如何將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)之間的範圍將大於或小於該示例中的範圍。因此,在一整天甚至一週之間的時間間隔應該由該功能覆蓋。

回答

2

不十分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))] 
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 
+0

關於良率版本,您的意思是刪除列表varialb,並只產生元素? – Raskayu

+0

建議添加:) – Raskayu

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 librarycan make "a few stops"