如何在几天、几小时、几周或几个月之后迭代一个时间段?
比如:
for date in foo(from_date, to_date, delta=HOURS): print date
其中 foo 是一个函数,返回一个迭代器。我一直在看日历模块,但它只能在一个特定的年份或月份使用,不能在日期之间使用。
这个库提供了一个方便的日历工具: MxDateTime,这应该足够了:)
我认为 Python 库中没有方法,但是您可以使用 日期时间模块轻松地创建一个方法:
from datetime import date, datetime, timedelta def datespan(startDate, endDate, delta=timedelta(days=1)): currentDate = startDate while currentDate < endDate: yield currentDate currentDate += delta
然后你可以这样使用它:
>>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3), >>> delta=timedelta(days=1)): >>> print day 2007-03-30 2007-03-31 2007-04-01 2007-04-02
或者,如果你想让你的三角洲变小:
>>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30), >>> datetime(2007, 3, 30, 18, 35), >>> delta=timedelta(hours=1)): >>> print timestamp 2007-03-30 15:30:00 2007-03-30 16:30:00 2007-03-30 17:30:00 2007-03-30 18:30:00
对于几个月的迭代,您需要一个不同的配方,因为 timedelta 不能表示“一个月”。
from datetime import date def jump_by_month(start_date, end_date, month_step=1): current_date = start_date while current_date < end_date: yield current_date carry, new_month = divmod(current_date.month - 1 + month_step, 12) new_month += 1 current_date = current_date.replace(year=current_date.year + carry, month=new_month)
(注意: 你必须从月份中减去1,然后把它加回到 new_month,因为 datetime.date的月份从1开始。)
new_month
datetime.date
使用 约会及其规则实现,如下所示:
from dateutil import rrule from datetime import datetime, timedelta now = datetime.now() hundredDaysLater = now + timedelta(days=100) for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater): print dt
输出是
2008-09-30 23:29:54 2008-10-30 23:29:54 2008-11-30 23:29:54 2008-12-30 23:29:54
用年、月、周、日、小时、分钟或秒代替月。将 dtstart 和 until 替换为所需的任何 datetime 对象。
这个食谱在所有情况下都有优势,包括每月一次。我可以找到的唯一警告是,如果您传递一个在所有月份中都不存在的日数,它将跳过这些月份。
您应该修改这一行以使其正确工作:
Current _ date = current _ date. place (year = current _ date. year + ary,month = new _ month,day = 1)
;)
月份迭代方法:
def months_between(date_start, date_end): months = [] # Make sure start_date is smaller than end_date if date_start > date_end: tmp = date_start date_start = date_end date_end = tmp tmp_date = date_start while tmp_date.month <= date_end.month or tmp_date.year < date_end.year: months.append(tmp_date) # Here you could do for example: months.append(datetime.datetime.strftime(tmp_date, "%b '%y")) if tmp_date.month == 12: # New year tmp_date = datetime.date(tmp_date.year + 1, 1, 1) else: tmp_date = datetime.date(tmp_date.year, tmp_date.month + 1, 1) return months
更多的代码,但它可以很好地处理长时间的检查,以确保给定的日期是有序的..。
我通过使用熊猫和日期时间库实现了这一点,这对我来说更加方便。
import pandas as pd from datetime import datetime DATE_TIME_FORMAT = '%Y-%m-%d %H:%M:%S' start_datetime = datetime.strptime('2018-05-18 00:00:00', DATE_TIME_FORMAT) end_datetime = datetime.strptime('2018-05-23 13:00:00', DATE_TIME_FORMAT) timedelta_index = pd.date_range(start=start_datetime, end=end_datetime, freq='H').to_series() for index, value in timedelta_index.iteritems(): dt = index.to_pydatetime() print(dt)