为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2019-10-17 15:35:15
我需要能够在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] = tmpTimedateRange[1] = dateRange[1].replace(day=1)lastMonth = tmpTime.monthmonths.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月,否则它将检查日期是否较小),如果数值较大,则将其附加到列表中数月之久,一直循环浏览,直到我到达结束日期为止。它完美地工作,只是似乎不是一个好方法...
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

看来,OP @Joshkunz问了发现这几个月是两个日期之间,而不是“多少个月”是两个日期之间。因此,我不确定为什么@JohnLaRooy被投票超过100次。@Joshkunz在原始问题下的评论中指出,他想要的是实际日期(或月份),而不是查找月份总数。


所以就出现了问题就想,两个日期之间2018-04-11,以2018-06-01


Apr 2018, May 2018, June 2018 

而如果它是什么之间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], 

       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

       increment the month in i

       if month is >= 13, then set it to 1, and increment the year by 1

   until either the year in i is > year in end_date, 

           or (year in i == year in end_date and month in i > month in end_date)

只是目前的pseduo代码,尚未经过测试,但我认为沿着同一思路的想法是可行的。


查看完整回答
反对 回复 2019-10-17
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

首先定义一些测试用例,然后您将看到该函数非常简单并且不需要循环


from datetime import datetime


def diff_month(d1, d2):

    return (d1.year - d2.year) * 12 + d1.month - d2.month


assert diff_month(datetime(2010,10,1), datetime(2010,9,1)) == 1

assert diff_month(datetime(2010,10,1), datetime(2009,10,1)) == 12

assert diff_month(datetime(2010,10,1), datetime(2009,11,1)) == 11

assert diff_month(datetime(2010,10,1), datetime(2009,8,1)) == 14

您应该在问题中添加一些测试用例,因为有很多潜在的极端情况需要解决-定义两个日期之间的月数的方法不止一种。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 564 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信