-
冉冉说
用途datetime.timedelta:from datetime import date, datetime, timedeltadef perdelta(start, end, delta): curr = start while curr < end: yield curr curr += delta>>> for result in perdelta(date(2011, 10, 10), date(2011, 12, 12), timedelta(days=4)):... print result...2011-10-102011-10-142011-10-182011-10-222011-10-262011-10-302011-11-032011-11-072011-11-112011-11-152011-11-192011-11-232011-11-272011-12-012011-12-052011-12-09适用于日期和日期时间对象。您的第二个示例:>>> for result in perdelta(datetime.now(),... datetime.now().replace(hour=19) + timedelta(days=1),... timedelta(hours=8)):... print result... 2012-05-21 17:25:47.6680222012-05-22 01:25:47.6680222012-05-22 09:25:47.6680222012-05-22 17:25:47.668022
-
SMILET
尝试这个:from datetime import datetimefrom dateutil.relativedelta import relativedeltadef date_range(start_date, end_date, increment, period): result = [] nxt = start_date delta = relativedelta(**{period:increment}) while nxt <= end_date: result.append(nxt) nxt += delta return result问题中的示例“从现在到明天19:00之间每8小时”将这样写:start_date = datetime.now()end_date = start_date + relativedelta(days=1)end_date = end_date.replace(hour=19, minute=0, second=0, microsecond=0)date_range(start_date, end_date, 8, 'hours') 请注意,的有效值period是为relativedelta相对信息定义的有效值,即:'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds', 'microseconds'。我的解决方案根据问题的要求返回一个列表。如果您一次不需要所有元素,则可以使用生成器,如@MartijnPieters的答案。
-
陪伴而非守候
我真的很喜欢@Martijn Pieters和@ÓscarLópez的回答。让我提出这两个答案之间的组合解决方案。from datetime import date, datetime, timedeltadef datetime_range(start, end, delta): current = start if not isinstance(delta, timedelta): delta = timedelta(**delta) while current < end: yield current current += deltastart = datetime(2015,1,1)end = datetime(2015,1,31)#this unlocks the following interface:for dt in datetime_range(start, end, {'days': 2, 'hours':12}): print dt print dt2015-01-01 00:00:002015-01-03 12:00:002015-01-06 00:00:002015-01-08 12:00:002015-01-11 00:00:002015-01-13 12:00:002015-01-16 00:00:002015-01-18 12:00:002015-01-21 00:00:002015-01-23 12:00:002015-01-26 00:00:002015-01-28 12:00:00