当前位置: 首页 > 面试题库 >

如何在python的datetime.date对象中添加“ 3个月”?

陆雨华
2023-03-14
问题内容

Python日期计算,您在哪里?

我有一个python应用程序,需要每隔三个月绘制几年的日期。重要的是,日期每年精确地发生4次,并且日期应尽可能在每年的同一天,并且日期应尽可能在每月的同一天,并且日期应为彼此之间的距离应尽可能接近“
3个月”(这是一个不断变化的目标,尤其是在leap年)。不幸的是,datetime.timedelta不支持几个月!

有没有一种“标准”的方式来在python中进行此计算???

SQL方式?

如果最糟的情况变得更糟,我将打赌,让我的应用程序向PostgreSQL(其对日期计算确实具有良好的内置支持)进行如下回答:

# select ('2010-11-29'::date + interval '3 months')::date;
    date    
------------
 2011-02-28
(1 row)

问题答案:

如果您要查找确切的日期或“更精确的”日期,那么最好检查一下dateutil。

快速示例

>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> TODAY = datetime.date.today()
>>> TODAY
datetime.date(2012, 3, 6)

现在,向加上3个月TODAY,观察它与当天完全匹配(请注意,relativedelta(months=3)并且relativedelta(month=3)行为不同。请确保使用months这些示例!)。

>>> three_mon_rel = relativedelta(months=3)
>>> TODAY + three_mon_rel
datetime.date(2012, 6, 6)

并且在整个一年中保持一致。从字面上看,这一天是每三个月一次(必须继续添加,因为某种原因将a乘relativedelta并将其添加到datetime.date对象会抛出TypeError):

>>> TODAY + three_mon_rel + three_mon_rel
datetime.date(2012, 9, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2012, 12, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2013, 3, 6)

而mVChr的建议解决方案虽然肯定“足够好”,但随着时间的推移会略有漂移:

>>> three_mon_timedelta = datetime.timedelta(days=3 * 365/12)
>>> TODAY + three_mon_timedelta
datetime.date(2012, 6, 5)

在一年的过程中,一个月中的某天持续下滑:

>>> TODAY + three_mon_timedelta * 2
datetime.date(2012, 9, 4)
>>> TODAY + three_mon_timedelta * 3
datetime.date(2012, 12, 4)
>>> TODAY + three_mon_timedelta * 4
datetime.date(2013, 3, 5)


 类似资料:
  • 问题内容: 我有两个代表相同事件实例的对象-一个保存日期,另一个保存该事件的时间,我想创建一个datetime对象。 由于不能简单地添加日期和时间对象(以下调用失败): 问题答案: 在python docs中 。 退货

  • 问题内容: 我想向中添加一个对象,但是每次我向具有3个属性的新对象添加时,都会出现错误。 在这里,我正在尝试创建其对象并将其传递给的类。 问题答案: 创建对象时需要使用运算符 要不然 并且您的构造函数不应包含。否则它将成为您班上的一个方法。

  • 我有“BaseProduct”类--抽象的,“food”类--实现了BaseProduct,还有一个“推车”,里面放了很多食物。 类食品如下所示: 类“cart”(购物车)如下所示:

  • 这里有两个类,查询语句和Stackov。arraylist用于存储查询语句类的对象。但是最近添加的对象覆盖了前一个对象。如何添加对象以使它们不被覆盖? QuerySentence.java Stackov.java

  • 我是java新手,正在努力克服它。我有类似(< code>String URL,int Score)的数据,我想在数组列表中实现它。我研究了如何在< code>ArrayList或< code>LinkedList中实现多种类型的变量,发现解决方案是从超类创建子类,我创建了这个子类: 我的超级班是: 当我尝试使用添加对象时,我遇到了错误?该错误说: 类型ArrayList中的add(int,MyS