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

2024-05-15 21:47:49 发布

您现在位置:Python中文网/ 问答频道 /正文

Python日期计算,你在哪里?

我有一个python应用程序,它需要每隔三个月规划一次日期,持续几年。重要的是,这些日期每年精确地出现4次,并且尽可能地出现在每年的同一天,并且日期尽可能地出现在每月的同一天,并且日期尽可能地接近“3个月”(这是一个移动的目标,尤其是闰年)。不幸的是,datetime.timedelta不支持几个月!

在python中有一种“标准”的计算方法吗???

SQL方式?

如果最坏的结果是最坏的,我会用punt让我的应用程序向PostgreSQL询问这样的答案,PostgreSQL对日期计算有很好的内置支持:

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

Tags: 答案应用程序目标sql标准datetimedatepostgresql
3条回答

这是一个很好的解决方案 http://www.voidspace.org.uk/python/weblog/arch_d7_2012_02_25.shtml#e1235

编辑 啊标准的方式对不起。。。

import datetime

some_date = datetime.date.today()
three_months = datetime.timedelta(3*365/12)
print (some_date + three_months).isoformat()
# => '2012-06-01'

然后将每个新年“正常化”到原来的日期(除非2月29日)

如果你在寻找确切的或者“更精确”的日期,你最好去看看dateutil

快速示例:

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

现在给TODAY加3个月,观察它是否与当天完全匹配(注意relativedelta(months=3)relativedelta(month=3)有不同的行为。确保在这些示例中使用months

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

而且在一年的时间里都保持一致。实际上,每三个月,在这一天(必须继续添加,因为出于某种原因,乘以一个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)

相关问题 更多 >