我想创建一个日期列表,从今天开始,追溯到任意天数,例如,在我的示例中是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

当前回答

下面是一个稍微不同的答案,基于S.Lott的答案,给出了两个日期开始和结束之间的日期列表。在下面的例子中,从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)]

其他回答

我知道这个回答有点晚,但我也遇到了同样的问题,我认为Python的内部范围函数在这方面有点缺乏,所以我在我的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))

稍微更好……

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

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)

从这个问题的标题中,我希望找到类似range()的东西,这将让我指定两个日期并创建一个包含所有日期的列表。这样,如果事先不知道,就不需要计算这两个日期之间的天数。

所以,冒着有点跑题的风险,这句话就可以了:

import datetime
start_date = datetime.date(2011, 1, 1)
end_date   = datetime.date(2014, 1, 1)

dates_2011_2013 = [ start_date + datetime.timedelta(n) for n in range(int ((end_date - start_date).days))]

所有功劳都归于这个答案!

一般来说,Pandas非常适合时间序列,并直接支持日期范围。

例如pd.date_range():

import pandas as pd
from datetime import datetime

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

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

参见日期范围文档

此外,它完全支持pytz时区,可以平滑地跨越春季/秋季夏令时转换。

编辑由OP:

如果你需要实际的python日期时间,而不是Pandas时间戳:

import pandas as pd
from datetime import datetime

pd.date_range(end = datetime.today(), periods = 100).to_pydatetime().tolist()

#OR

pd.date_range(start="2018-09-09",end="2020-02-02")

这使用"end"参数来匹配原始问题,但如果你想要降序日期:

pd.date_range(datetime.today(), periods=100).to_pydatetime().tolist()