我想创建一个日期列表,从今天开始,向前推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(numdays)]
Pandas
通常用于时间序列,并直接支持日期范围。
import pandas as pd
from datetime import datetime
datelist = pd.date_range(datetime.today(), periods=100).tolist()
此外,它还有许多选项可以使生活更加轻松。例如,如果你只想要工作日,你只需要切换到bdate_range
。
请查看日期范围文档。
此外,它完全支持pytz时区,并且可以平稳地跨越春/秋季节变化。
编辑者注:
如果您需要实际的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()
DataFrame
(因为它是一个 DatetimeIndex
),你可以使用 to_frame()
方法:pd.date_range(start='2018-09-09', end='2020-02-02').to_frame(name='dates')
- Bilbottompd.date_range
会被弃用,如果Python datetime中没有等效的方法?FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version.
- Billpd.date_range
的警告;也许你在其他地方使用了 pd.datetime
?请参考 https://dev59.com/rlIH5IYBdhLWcg3wKKBU#60856931 - fantabolous获取指定起始日期和结束日期之间的日期范围(针对时间和空间复杂度进行了优化):
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")
(end-start+1)
不可行,你不能将时间差和整数相加。但是你可以使用 (end-start).days + 1
。 - Stephen Paulger你可以编写一个生成器函数,从今天开始返回日期对象:
import datetime
def date_generator():
from_date = datetime.datetime.today()
while True:
yield from_date
from_date = from_date - datetime.timedelta(days=1)
这个生成器返回从今天开始每次向后一天的日期。以下是如何获取前三个日期:
>>> 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)]
使用这种方法的好处是,与循环或列表推导式相比,您可以返回任意次数。
编辑
使用生成器表达式而不是函数的更紧凑版本:
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)]
rrule
模块:https://dateutil.readthedocs.io/en/stable/rrule.html。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)
或者根据评论中的建议,您可以创建这样的列表:
date_range = [
datetime.date.fromordinal(ordinal)
for ordinal in range(
start_date.toordinal(),
end_date.toordinal(),
)
]
从这个问题的标题上,我期望找到类似于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))]
所有功劳归于此回答!
start
和end
之间的日期列表。 在下面的示例中,从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 dateutil import rrule, parser
date1 = '1995-01-01'
date2 = '1995-02-28'
datesx = list(rrule.rrule(rrule.DAILY, dtstart=parser.parse(date1), until=parser.parse(date2)))
根据我为自己写下的答案:
import datetime;
print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]
输出:
['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']
date
' 对象,而不是 'datetime.datetime
' 对象。
date_list = [base - datetime.timedelta(days=x+1) for x in range(7)]
日期列表 = [基准日期 - datetime.timedelta(days=x+1) for x in range(7)] - Corvax