创建一个计算具有条件的日期之间频率的函数

时间:2018-05-28 05:34:16

标签: python python-3.x datetime for-loop

我想编写一个带Dates的两个条件的函数。这是怎么回事:让我说我有两个日期,DATE1 = 30-06-2018和DATE2 = 30-12-2019,以及一个叫做频率的变量(它可以是6或4或1)。

我需要计算这两个DATE1和DATE2之间的频率日期。如果频率为6,则应将DATE1添加6个月,直到它不大于DATE2,即

if frq == 6:
            Date_11 = DATE1 + relativedelta(months=+6)
            Date_12 = Date_11 + relativedelta(months=+6)
            Date_13 = Date_12 + relativedelta(months=+6)
            Print(date_11,date_12,date_13)

你可以看到我停止使用Date_13,因为它不能超过它。因为Date_13需要小于DATE2。如果频率为4,我应该每4个月添加一次,

if frq == 4:
            Date_11 = DATE1 + relativedelta(months=+4)
            Date_12 = Date_11 + relativedelta(months=+4)
            Date_13 = Date_12 + relativedelta(months=+4)
            Date_14 = Date_13 + relativedelta(months=+4)
            Print(date_11,date_12,date_13,date_14)

在这里我停止使用Date_14,因为Date_15将大于DATE2。

有人可以建议我如何使用if和for以及两个条件来编写一个循环吗?

1 个答案:

答案 0 :(得分:0)

您可以使用生成器函数和while循环来实现此目的。

import datetime
from dateutil.relativedelta import relativedelta


def _convert_to_date_time_object(date_):
    return datetime.datetime.strptime(date_, '%d-%m-%Y').date()


def yield_date_in_between_range(date_one_in_str, date_two_in_str, frequency_):
    # Convert input date string into python date time object.
    date_one, date_two = map(_convert_to_date_time_object,                       
                            [date_one_in_str, date_two_in_str])

    # Add month and check whether if it exceeds more than limit.
    date_one = date_one + relativedelta(months=+frequency_)
    if date_one >= date_two:
        raise StopIteration
    while date_one < date_two:
        yield date_one
        date_one = date_one + relativedelta(months=+frequency_)

演示

>> input_date_one = "30-06-2018"
>> input_date_two = "30-12-2019"
>> frequency = 6

>> print(list(yield_date_in_between_range(input_date_one, input_date_two, frequency)))
>> ['30-12-2018', '30-06-2019']

>> input_date_one = "30-06-2018"
>> input_date_two = "30-07-2018"
>> frequency = 6

>>print(list(yield_date_in_between_range(input_date_one, input_date_two, frequency)))
>> []