在Python中创build一个date范围

我想创build一个date列表,从今天开始,然后返回任意一天,比如在我的例子中是100天。 有没有更好的办法做到这一点?

import datetime a = datetime.datetime.today() numdays = 100 dateList = [] for x in range (0, numdays): dateList.append(a - datetime.timedelta(days = x)) print dateList 

更好的…

 base = datetime.datetime.today() date_list = [base - datetime.timedelta(days=x) for x in range(0, numdays)] 

大pandas对于时间序列总的来说很棒,并且对date范围有直接的支持。

 import pandas as pd datelist = pd.date_range(pd.datetime.today(), periods=100).tolist() 

它也有很多选项让生活更轻松。 例如,如果您只需要工作日,则只需交换bdate_range

请参阅http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps

此外,它完全支持pytz时区,并可以平滑跨越春季/秋季的DST变化。

你可以编写一个从今天开始返回date对象的生成器函数:

 import datetime def date_generator(): from_date = datetime.datetime.today() while True: yield from_date from_date = from_date - datetime.timedelta(days=1) 

这个生成器返回从今天开始的date,并且一次返回一天。 以下是如何取得前三个date:

 >>> import itertools >>> dates = itertools.islice(date_generator(), 3) >>> list(dates) [datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)] 

这种方法在循环或列表理解上的优势在于,您可以根据需要多次返回。

编辑

使用生成器expression式而不是函数的更紧凑版本:

 date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count()) 

用法:

 >>> dates = itertools.islice(date_generator, 3) >>> list(dates) [datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)] 

获取指定开始date和结束date之间的date范围(针对时间和空间复杂性进行了优化):

 import datetime start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y") end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y") date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)] for date in date_generated: print date.strftime("%d-%m-%Y") 

是的,重新发明轮子….只是search论坛,你会得到这样的事情:

 from dateutil import rrule from datetime import datetime list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now())) 

你也可以使用一天的序数来简化:

 def date_range(start_date, end_date): for ordinal in range(start_date.toordinal(), end_date.toordinal()): yield datetime.date.fromordinal(ordinal) 

或者按照评论中的build议,你可以像这样创build一个列表:

 date_range = [ datetime.date.fromordinal(ordinal) for ordinal in range( start_date.toordinal(), end_date.toordinal(), ) ] 

从这个问题的标题我期待find像range() ,这将让我指定两个date,并创build一个列表中的所有date列表。 这样一个人不需要计算这两个date之间的天数,如果事先不知道的话。

所以,有一点点偏离主题的风险,这一行就能做到这一点:

 import datetime start_date = datetime.date(2011, 01, 01) end_date = datetime.date(2014, 01, 01) dates_2011_2013 = [ start_date + datetime.timedelta(n) for n in range(int ((end_date - start_date).days))] 

所有学分到这个答案 !

我知道一些迟到的答案,但我也有同样的问题,并决定在这方面Python的内部范围function有点欠缺,所以我已经在我的一个util模块覆盖它。

 from __builtin__ import range as _range from datetime import datetime, timedelta def range(*args): if len(args) != 3: return _range(*args) start, stop, step = args if start < stop: cmp = lambda a, b: a < b inc = lambda a: a + step else: cmp = lambda a, b: a > b inc = lambda a: a - step output = [start] while cmp(start, stop): start = inc(start) output.append(start) return output print range(datetime(2011, 5, 1), datetime(2011, 10, 1), timedelta(days=30)) 

这是从我自己的代码创build的要点,这可能会有所帮助。 (我知道这个问题太老了,但别人可以使用它)

https://gist.github.com/2287345

(同样的事情下面)

 import datetime from time import mktime def convert_date_to_datetime(date_object): date_tuple = date_object.timetuple() date_timestamp = mktime(date_tuple) return datetime.datetime.fromtimestamp(date_timestamp) def date_range(how_many=7): for x in range(0, how_many): some_date = datetime.datetime.today() - datetime.timedelta(days=x) some_datetime = convert_date_to_datetime(some_date.date()) yield some_datetime def pick_two_dates(how_many=7): a = b = convert_date_to_datetime(datetime.datetime.now().date()) for each_date in date_range(how_many): b = a a = each_date if a == b: continue yield b, a 

这是一个用于bash脚本来获得星期几列表的单线程,这是Python 3.很容易修改,最后int是过去你想要的天数。

 python -c "import sys,datetime; print('\n'.join([(datetime.datetime.today() - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int(sys.argv[1])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 10 

这是一个提供开始(或更确切的说,结束)date的变种

 python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d \") for x in range(0,int(sys.argv[2])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/30 10 

这是任意开始和结束date的变体。 不是说这不是非常有效,但是在bash脚本中放置一个for循环是很好的:

 python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") + datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int((datetime.datetime.strptime(sys.argv[2], \"%Y/%m/%d\") - datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\")).days)) if (datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\") + datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/15 2015/12/30 

Matplotlib相关

 from matplotlib.dates import drange import datetime base = datetime.date.today() end = base + datetime.timedelta(days=100) delta = datetime.timedelta(days=1) l = drange(base, end, delta) 

这里有一个与S.Lott的回答略有不同的答案,它给出了两个datestartend之间的date列表。 在下面的例子中,从2017年开始到今天。

 start = datetime.datetime(2017,1,1) end = datetime.datetime.today() daterange = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)] 
 from datetime import datetime, timedelta from dateutil import parser def getDateRange(begin, end): """ """ beginDate = parser.parse(begin) endDate = parser.parse(end) delta = endDate-beginDate numdays = delta.days + 1 dayList = [datetime.strftime(beginDate + timedelta(days=x), '%Y%m%d') for x in range(0, numdays)] return dayList 
 import datetime def date_generator(): cur = base = datetime.date.today() end = base + datetime.timedelta(days=100) delta = datetime.timedelta(days=1) while(end>base): base = base+delta print base date_generator()