2016-04-28 98 views
0

如何查找日期範圍內的小時數?我目前正在計算和打印兩個給定日期之間的日期。計算Python中日期之間的小時數範圍

from datetime import timedelta as td, datetime 

d1 = datetime.strptime(start_date, '%Y-%m-%d') 
d2 = datetime.strptime(end_date, '%Y-%m-%d') 

def get_delta(d1, d2): 
    delta = d2 - d1 
    return delta 

delta = get_delta(d1,d2) 
for i in range(delta.days + 1): 
    print d1 + td(days=i) 

電流輸出:

2016-04-22 
2016-04-23 
2016-04-24 
2016-04-25 
2016-04-26 
2016-04-27 
2016-04-28 
... 

預期輸出:

2016-04-22 00:00:00 
2016-04-22 01:00:00 
2016-04-22 02:00:00 
2016-04-22 03:00:00 
2016-04-22 04:00:00 
2016-04-22 05:00:00 
2016-04-22 06:00:00 
2016-04-22 07:00:00 
... 
+1

什麼是get_delta()? d1和d2是datetime.datetime對象還是datetime.date對象? – kingledion

回答

3

你被天遞增的時間,而不是小時,timedelta(days=i)而不是timedelta(hours=i)

from datetime import timedelta as td, datetime 

start_date = '2016-01-01' 
end_date = '2016-01-02' 
d1 = datetime.strptime(start_date, '%Y-%m-%d') 
d2 = datetime.strptime(end_date, '%Y-%m-%d') 

def get_delta(d1, d2): 
    delta = d2 - d1 
    return delta 

delta = get_delta(d1,d2) 
for i in range(delta.days * 24 + 1): 
    print d1 + td(hours=i) 

輸出:

2016-01-01 00:00:00 
2016-01-01 01:00:00 
... 
... 
2016-01-01 23:00:00 
2016-01-02 00:00:00 
+1

這不會總是貫穿整個最後一天,而不僅僅是end_date中的小時? – Michael

+0

是的,它會的。我只是儘量保持儘可能接近原始代碼片段。 –

+1

夠公平的。我想,只要OP堅持從格式'%Y-%m-%d'獲取日期,這不會是一個問題。我想我會指出。 – Michael

0

如果你看一下Python文檔的timedelta對象:

只有天,秒和微秒存儲在內部

所以,如果你想獲得小時,你必須從秒轉換它。

喜歡的東西:

for i in range(delta.seconds/3600 + delta.days * 24): 
    print d1 + td(seconds=3600 * i) 
0

嘗試是這樣的:

import datetime 

d1 = datetime.datetime(2016, 4, 28) 
d2 = d1 + datetime.timedelta(days = 2) 

delta = (d2 - d1).total_seconds()/3600 
for i in range(int(delta)): 
    print(d1 + datetime.timedelta(hours=i)) 
0

爲了增強可讀性,有在邊緣的情況下會發生什麼,你可以定義date_range()功能類似於內建range()功能明確的語義:

def date_range(start, end, step): 
    while start < end: 
     yield start 
     start += step 

例子:

from datetime import datetime, timedelta 

HOUR = timedelta(hours=1) 

def parse(date_string): 
    '''Parse *date_string* in the %Y-%m-%d format.''' 
    return datetime(*map(int, date_string.split('-'))) 

for dt in date_range(parse(start_date), parse(end_date), HOUR): 
    print(dt) 

注意:end_date + ' 00:00:00不存在於輸出中。 date_range()的行爲類似range(),其中不包括end。您可以通過parse(end_date) + HOUR以包含end_date