python - 有没有一种简单的方法可以在 Python 中增加一个 datetime 对象一个月?

标签 python datetime

所以我试图找到一种方法将日期时间对象增加一个月。然而,根据 this question 的说法,这似乎并不那么简单。 .

我希望得到类似的东西:

import datetime as dt

now = dt.datetime.now()
later = now + dt.timedelta(months=1)

但这不起作用。如果可能的话,我也希望能够在下个月的同一天(或最接近的替代方案)去。例如,在 1 月 1 日设置的日期时间对象将增加到 2 月 1 日,而在 2 月 28 日设置的日期时间对象将增加到 3 月 31 日,而不是 3 月 28 日或其他时间。

需要明确的是,2 月 28 日(通常)会映射到 3 月 31 日,因为它是当月的最后一天,因此它应该是下个月的最后一天。否则它将是一个直接链接:增量应该到下个月具有相同编号日期的那一天。

在当前版本的 Python 中是否有一种简单的方法可以做到这一点?

最佳答案

查看 from dateutil.relativedelta import * 要为日期添加特定的时间量,您可以继续使用 timedelta 来处理简单的事情,即

import datetime
from dateutil.relativedelta import *
use_date = datetime.datetime.now()

use_date = use_date + datetime.timedelta(minutes=+10)
use_date = use_date + datetime.timedelta(hours=+1)
use_date = use_date + datetime.timedelta(days=+1)
use_date = use_date + datetime.timedelta(weeks=+1)

或者你可以开始使用relativedelta

use_date = use_date+relativedelta(months=+1)

use_date = use_date+relativedelta(years=+1)

下个月的最后一天:

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)

现在这将提供 29/02/2016

下个月的倒数第二天:

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)
use_date = use_date+relativedelta(days=-1)

下个月的最后一个星期五:

use_date = use_date+relativedelta(months=+1, day=31, weekday=FR(-1))

下个月的第二个星期二:

new_date = use_date+relativedelta(months=+1, day=1, weekday=TU(2))

正如@mrroot5 指出的那样,可以应用 dateutil 的 rrule 函数,如果您需要日期出现,则可以为您带来额外的 yield 。
例如:
从上个月的最后一天开始计算 9 个月的当月的最后一天。
然后,计算每个月的第二个星期二。

from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import datetime
use_date = datetime(2020,11,21)

#Calculate the last day of last month
use_date = use_date+relativedelta(months=-1)
use_date = use_date+relativedelta(day=31)

#Generate a list of the last day for 9 months from the calculated date
x = list(rrule(freq=MONTHLY, count=9, dtstart=use_date, bymonthday=(-1,)))
print("Last day")
for ld in x:
    print(ld)

#Generate a list of the 2nd Tuesday in each of the next 9 months from the calculated date
print("\n2nd Tuesday")
x = list(rrule(freq=MONTHLY, count=9, dtstart=use_date, byweekday=TU(2)))
for tuesday in x:
    print(tuesday)

Last day
2020-10-31 00:00:00
2020-11-30 00:00:00
2020-12-31 00:00:00
2021-01-31 00:00:00
2021-02-28 00:00:00
2021-03-31 00:00:00
2021-04-30 00:00:00
2021-05-31 00:00:00
2021-06-30 00:00:00

2nd Tuesday
2020-11-10 00:00:00
2020-12-08 00:00:00
2021-01-12 00:00:00
2021-02-09 00:00:00
2021-03-09 00:00:00
2021-04-13 00:00:00
2021-05-11 00:00:00
2021-06-08 00:00:00
2021-07-13 00:00:00

rrule 可用于查找特定日期的下一个日期。
例如下一个 1 月 1 日发生在星期一(今天是 2021 年 11 月 4 日)

from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import *
year = rrule(YEARLY,dtstart=datetime.now(),bymonth=1,bymonthday=1,byweekday=MO)[0].year
year
2024

或接下来的 5 x 1 月 1 日发生在星期一

years = rrule(YEARLY,dtstart=datetime.now(),bymonth=1,bymonthday=1,byweekday=MO)[0:5]
for i in years:print(i.year)
... 
2024
2029
2035
2046
2052

从星期一开始的明年第一个月:

>>> month = rrule(YEARLY,dtstart=datetime.date(2023, 1, 1),bymonthday=1,byweekday=MO)[0]
>>> month.strftime('%Y-%m-%d : %B')
'2023-05-01 : May'

如果您需要两个日期之间从星期一开始的月份:

months = rrule(YEARLY,dtstart=datetime.date(2025, 1, 1),until=datetime.date(2030, 1, 1),bymonthday=1,byweekday=MO)
>>> for m in months:
...     print(m.strftime('%Y-%m-%d : %B'))
... 
2025-09-01 : September
2025-12-01 : December
2026-06-01 : June
2027-02-01 : February
2027-03-01 : March
2027-11-01 : November
2028-05-01 : May
2029-01-01 : January
2029-10-01 : October

这绝不是可用内容的详尽列表。 文档可在此处获得:https://dateutil.readthedocs.org/en/latest/

关于python - 有没有一种简单的方法可以在 Python 中增加一个 datetime 对象一个月?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066588/

相关文章:

python - 使用 spines 在 matplotlib 中仅自定义刻度线的一侧

Python - 构建可执行文件时出现问题

java - 如何将刻度从 java 转换为带有时区的 DateTime c#

mysql - 连接日期函数mysql

oracle - 获取时间范围之间的间隙

python - PIL不保存透明度

Python在3D散点图中用线连接相邻点

python - SQLAlchemy 中是否有 BigInteger?

PHP DateTime::Diff 弄错了吗?

php - 使用 Bootstrap-Editable 时日期时间更新出错