在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的回答略有不同的答案,它给出了两个datestart
和end
之间的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()