生成间隔之间的日期时间列表

给定两个日期时间(start_date和end_date),我想生成这两个日期之间其他日期时间的列表,新的日期时间由可变的时间间隔分隔。例如,在2011-10-10和2011-12-12之间每4天一次,或者从现在到明天19 p.m之间每8小时一次。


也许大致等同于Dateperiod PHP类。


用Python完成此操作的最有效方法是什么?


慕沐林林
浏览 430回答 3
3回答

冉冉说

用途datetime.timedelta:from datetime import date, datetime, timedeltadef perdelta(start, end, delta):&nbsp; &nbsp; curr = start&nbsp; &nbsp; while curr < end:&nbsp; &nbsp; &nbsp; &nbsp; yield curr&nbsp; &nbsp; &nbsp; &nbsp; curr += delta>>> for result in perdelta(date(2011, 10, 10), date(2011, 12, 12), timedelta(days=4)):...&nbsp; &nbsp; &nbsp;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(),...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;datetime.now().replace(hour=19) + timedelta(days=1),...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;timedelta(hours=8)):...&nbsp; &nbsp; &nbsp;print result...&nbsp;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):&nbsp; &nbsp; result = []&nbsp; &nbsp; nxt = start_date&nbsp; &nbsp; delta = relativedelta(**{period:increment})&nbsp; &nbsp; while nxt <= end_date:&nbsp; &nbsp; &nbsp; &nbsp; result.append(nxt)&nbsp; &nbsp; &nbsp; &nbsp; nxt += delta&nbsp; &nbsp; 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')&nbsp; &nbsp;&nbsp;请注意,的有效值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):&nbsp; &nbsp; current = start&nbsp; &nbsp; if not isinstance(delta, timedelta):&nbsp; &nbsp; &nbsp; &nbsp; delta = timedelta(**delta)&nbsp; &nbsp; while current < end:&nbsp; &nbsp; &nbsp; &nbsp; yield current&nbsp; &nbsp; &nbsp; &nbsp; 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}):&nbsp; &nbsp; print dt&nbsp; &nbsp; 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python