2011-05-03 44 views
10

我有包含在YYYY-MM-DD格式的日期兩個字符串變量如下:生成一個給定的範圍內的所有的日期在python

date1 = '2011-05-03' 
date2 = '2011-05-10' 

我想要寫產生在範圍DATE1所有日期代碼到目前爲止2。這怎麼可以在Python中完成?

+2

重複http://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python – 2011-05-03 10:29:20

+1

@msa可能,但不是那一個。 – badp 2011-05-03 10:37:44

+0

[在Python中通過一系列日期迭代]的可能的重複(http://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python) – kasperd 2015-09-25 13:19:44

回答

2
import datetime 
real_date1 = datetime.date(*[int(x) for x in date1.split('-')]) 
real_date2 = datetime.date(*[int(x) for x in date2.split('-')]) 
date_range = real_date2 - real_date1 
dates = list() 
for days in xrange(date_range.days): 
    dates.append(real_date1 + datetime.timedelta(days)) 

print dates 
2
import time 

def dates_between(start, end): 
    start_epoch = int(time.mktime(time.strptime(start, "%Y-%m-%d"))) 
    end_epoch = int(time.mktime(time.strptime(end, "%Y-%m-%d"))) + 1 #include end 
    return range(start_epoch, end_epoch, 86400) 
+2

這打破了幾天不是86,400個紀元秒,但我不是Jon Skeet-y足以知道這個假設是否「足夠好」。 – badp 2011-09-26 07:42:05

14
from dateutil import rrule, parser 

date1 = '2011-05-03' 
date2 = '2011-05-10' 

dates = list(rrule.rrule(rrule.DAILY, 
         dtstart=parser.parse(date1), 
         until=parser.parse(date2))) 

print dates 

由於dateutil是不是一個標準庫,你必須安裝它作爲一個單獨的包。有關格式的更多詳細信息,請參閱文檔(特別是dayfirstyearfirst開關)。

+1

很酷。解析器如何知道它是yyyy-mm-dd還是yyyy-dd-mm? – 2011-05-03 10:38:57

1
>>> for a in range(9): 
...  print(datetime.date(2011, 05, 03) + datetime.timedelta(a)) 
... 
2011-05-03 
2011-05-04 
2011-05-05 
2011-05-06 
2011-05-07 
2011-05-08 
2011-05-09 
2011-05-10 
2011-05-11 

我不太確定字符串的解析是整數還是隻是您開始問題的方式。如果是這樣,請忽略答案過於簡化

19

日期可以像數字一樣相互比較,並且可以使用datetime.timedelta對象進行與日期有關的數學計算。沒有理由在這裏使用dateutil,並且沒有必要硬編碼'範圍(9)'的迭代次數。這與您處理普通舊數字的方式非常相似。

>>> import datetime 
>>> date1 = '2011-05-03' 
>>> date2 = '2011-05-10' 
>>> start = datetime.datetime.strptime(date1, '%Y-%m-%d') 
>>> end = datetime.datetime.strptime(date2, '%Y-%m-%d') 
>>> step = datetime.timedelta(days=1) 
>>> while start <= end: 
...  print start.date() 
...  start += step 
... 
2011-05-03 
2011-05-04 
2011-05-05 
2011-05-06 
2011-05-07 
2011-05-08 
2011-05-09 
2011-05-10 
>>> 
3

我喜歡這個,因爲它是直觀的,它給了日期字符串數組。

import re 
import datetime 

def datetime_to_str_date(dt): 
    return re.sub(r'\T.+$','', dt.isoformat()) 

start_date = datetime.datetime.strptime('2016-01-01', '%Y-%m-%d') 
end_date = datetime.datetime.today() 
num_of_days = (end_date - start_date).days 

date_list = map(
     datetime_to_str_date, 
     [start_date + datetime.timedelta(days=x) for x in range(0, num_of_days)] 
) 
2

假設你的日期已爲datetime.date類,你可以使用.fromordinal.toordinal創建此oneliner。

from datetime import date 

start_date = date(2011, 5, 3) 
end_date = date(2011, 5, 10) 

[date.fromordinal(i) for i in range(start_date.toordinal(), end_date.toordinal())] 

結果是獨家end_date。使用end_date.toordinal() + 1的範圍包括end_date

相關問題