如何在python中获取过去四个月的第一个和最后一个日期

如何在python中获取过去四个月的第一个和最后一个日期,python,python-datetime,Python,Python Datetime,我想知道过去四个月的第一个和最后一个日期。我尝试过以下概念 @staticmethod def getDateRangeByMonth(year, month): """ :param year: :param month: :return: """ if year is None: today = datetime.today() year = today.year if month is None:

我想知道过去四个月的第一个和最后一个日期。我尝试过以下概念

@staticmethod
def getDateRangeByMonth(year, month):
    """

    :param year:
    :param month:
    :return:
    """
    if year is None:
        today = datetime.today()
        year = today.year
    if month is None:
        today = datetime.today()
        month = today.month
    _, num_days = calendar.monthrange(year, month)
    since = datetime.datetime.strptime(str(datetime.date(year, month, 
    1)), "%Y-%m-%d")
    till = datetime.datetime.strptime(str(datetime.date(year, month, 
    num_days)), "%Y-%m-%d")

    return since, till



 for i in range(0,4):
     today = datetime.today()
     since, till = getDateRangeByMonth(today.year, today.month - i)
我知道,当过去的一个月跨越前一年时,这个概念就会下降,比如说,如果月份是一月或二月,那么这一年就必须改变

如何改变这一点,或者我在这方面出了什么问题


提前感谢

这里有一个修改过的函数,它为您提供所需的前几个月的开始和结束日期:

def getPrevDateRangeByMonth(year, month, prev):

    if year is None:
        today = datetime.date.today()
        year = today.year
    if month is None:
        today = datetime.date.today()
        month = today.month
    since = []
    till = []
    for i in range(prev):
        if month == 0:
            year -= 1
            month = 12
        _, num_days = calendar.monthrange(year, month)
        since.append(datetime.datetime.strptime(str(datetime.date(year, month, 1)), "%Y-%m-%d"))
        till.append(datetime.datetime.strptime(str(datetime.date(year, month, num_days)), "%Y-%m-%d"))
        month -= 1
    return since, till

prev = 4
today = datetime.date.today()
since, till = getPrevDateRangeByMonth(2017, 3, prev)
for i in range(prev):
    print(since[i], till[i])

我已经将
datetime.today()
更改为
datetime.date.today()
因为这是我的工作方式,所以您可能应该将其更改回去。

在下面的代码中,诀窍是datetime模块提供
timedelta
提前一天执行,并
date.replace
以获得月的第一天。下面是一个简单的函数:

def start_end_by_month(dat, delta):
    d = dat.replace(day = 1)
    till = []
    since = []
    for i in range(delta):
        d = d - datetime.timedelta(days=1)
        till.append(d)
        d = d.replace(day=1)
        since.append(d)
    return since, till
用法示例:

>>> start_end_by_month(datetime.date(2008, 3, 10), 5)
([datetime.date(2008, 2, 1), datetime.date(2008, 1, 1), datetime.date(2007, 12, 1),
datetime.date(2007, 11, 1), datetime.date(2007, 10, 1)],
[datetime.date(2008, 2, 29), datetime.date(2008, 1, 31), datetime.date(2007, 12, 31),
datetime.date(2007, 11, 30), datetime.date(2007, 10, 31)])

显示它很容易跳过一年的边界…

如果月份不确定您是否需要所有这些,如果您只是在每次减少时跟踪月份值,并且一旦它从一月移动到十二月,它将从0减少到-1。他们知道你应该在12月份,所以你把它设为12,并减少一年