猿问

查找两个日期之间的月份的最佳方法

我需要能够在python中准确找到两个日期之间的月份。我有一个可行的解决方案,但它不是很好(如优雅)或快速。


dateRange = [datetime.strptime(dateRanges[0], "%Y-%m-%d"), datetime.strptime(dateRanges[1], "%Y-%m-%d")]

months = [] 


tmpTime = dateRange[0]

oneWeek = timedelta(weeks=1)

tmpTime = tmpTime.replace(day=1)

dateRange[0] = tmpTime

dateRange[1] = dateRange[1].replace(day=1)

lastMonth = tmpTime.month

months.append(tmpTime)

while tmpTime < dateRange[1]:

    if lastMonth != 12:

        while tmpTime.month <= lastMonth:

            tmpTime += oneWeek

        tmpTime = tmpTime.replace(day=1)

        months.append(tmpTime)

        lastMonth = tmpTime.month


    else:

        while tmpTime.month >= lastMonth:

            tmpTime += oneWeek

        tmpTime = tmpTime.replace(day=1)

        months.append(tmpTime)

        lastMonth = tmpTime.month

因此,为了说明一下,我在这里正在做的是获取两个日期并将其从iso格式转换为python datetime对象。然后,我在开始日期时间对象中添加一个星期,并检查月份的数值是否较大(除非月份是12月,否则它将检查日期是否较小),如果数值较大,则将其附加到列表中数月之久,一直循环浏览,直到我到达结束日期为止。


它完美地工作,只是似乎不是一个好方法...


POPMUISE
浏览 565回答 3
3回答

翻翻过去那场雪

看来,OP @Joshkunz问了发现这几个月是两个日期之间,而不是“多少个月”是两个日期之间。因此,我不确定为什么@JohnLaRooy被投票超过100次。@Joshkunz在原始问题下的评论中指出,他想要的是实际日期(或月份),而不是查找月份总数。所以就出现了问题就想,两个日期之间2018-04-11,以2018-06-01Apr 2018, May 2018, June 2018&nbsp;而如果它是什么之间2014-04-11要2018-06-01?那么答案将是Apr 2014, May 2014, ..., Dec 2014, Jan 2015, ..., Jan 2018, ..., June 2018这就是为什么很多年前我拥有以下伪代码的原因。它仅建议使用两个月作为终点并遍历它们,每次增加一个月。@Joshkunz提到他想要“月”,还提到他想要“日期”,在不确切知道的情况下,编写确切的代码很困难,但是想法是使用一个简单的循环遍历端点,并且一次增加一个月。八年前的2010年的答案:如果增加一周,那么它将按需要进行大约4.35倍的工作。为什么不只是:1. get start date in array of integer, set it to i: [2008, 3, 12],&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;and change it to [2008, 3, 1]2. get end date in array: [2010, 10, 26]3. add the date to your result by parsing i&nbsp; &nbsp; &nbsp; &nbsp;increment the month in i&nbsp; &nbsp; &nbsp; &nbsp;if month is >= 13, then set it to 1, and increment the year by 1&nbsp; &nbsp;until either the year in i is > year in end_date,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;or (year in i == year in end_date and month in i > month in end_date)只是目前的pseduo代码,尚未经过测试,但我认为沿着同一思路的想法是可行的。

一只斗牛犬

首先定义一些测试用例,然后您将看到该函数非常简单并且不需要循环from datetime import datetimedef diff_month(d1, d2):&nbsp; &nbsp; return (d1.year - d2.year) * 12 + d1.month - d2.monthassert diff_month(datetime(2010,10,1), datetime(2010,9,1)) == 1assert diff_month(datetime(2010,10,1), datetime(2009,10,1)) == 12assert diff_month(datetime(2010,10,1), datetime(2009,11,1)) == 11assert diff_month(datetime(2010,10,1), datetime(2009,8,1)) == 14您应该在问题中添加一些测试用例,因为有很多潜在的极端情况需要解决-定义两个日期之间的月数的方法不止一种。
随时随地看视频慕课网APP

相关分类

Python
我要回答