Python日期计算,你在哪里?
我有一个Python应用程序,需要在几年内每三个月绘制一次日期。重要的是,日期每年正好出现4次,而且日期尽可能出现在每年的同一天,日期尽可能出现在每月的同一天,日期之间的间隔尽可能接近“3个月”(这是一个移动的目标,特别是在闰年)。不幸的是,datetime.timedelta
不支持月份!
在python中有没有一个“标准”的方法来做这个计算???
SQL方式?
如果最坏的情况发生,我会让我的应用程序询问PostgreSQL,它确实有很好的内置日期计算支持,答案如下:
# select ('2010-11-29'::date + interval '3 months')::date;
date
------------
2011-02-28
(1 row)
6条答案
按热度按时间pn9klfpd1#
如果你正在寻找确切或“更精确”的日期,你最好去看看dateutil。
简单的例子:
现在将3个月添加到
TODAY
,观察它是否与日期完全匹配(注意,relativedelta(months=3)
和relativedelta(month=3)
具有不同的行为。请确保在这些示例中使用months
!)。它在一年中保持一致。实际上每三个月,在这一天(不得不继续添加,因为出于某种原因,乘以
relativedelta
并将其添加到datetime.date
对象会抛出TypeError
):而mVChr建议的解决方案,虽然肯定“足够好”,但随着时间的推移略有漂移:
在一年的时间里,月的日期一直在滑动:
lrpiutwd2#
然后“正常化”每一个新的一年,原来的日期的一天(除非2月29日)
vatpfxk53#
使用Python标准库,即不使用
dateutil
或其他库,并解决“2月31日”问题:测试:
zkure5ic4#
来自@david-ragazzi和@mikedugas77的答案在
months
为正值时工作良好,但在months <= -date.month
为负值时则不工作。下面是一个修改,即使对于负的月份偏移量也应该工作:使用今天的日期进行一些测试:
mctunoxg5#
我写了这个函数,也许可以帮助你:
它还支持添加负月份(即减去月份)。
以下是一些示例用法,说明如何根据您的规格获取2021和2022日期:
5tmbdcev6#
我没有足够的声誉来发表评论。所以,我只是要写一个解决方案,修复一个错误的解决方案,大卫Ragazzi张贴。
当您添加足够的月份以获得12月日期时发生错误。年份太多了1。
例如,
add_months(date.fromisoformat('2020-01-29'), 11)
返回2021而不是2020。我通过更改以year =
开始的行来修复这个问题。