所以我试图找到一种方法将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中有没有一种简单的方法可以做到这一点?
答案 0 :(得分:49)
查看from dateutil.relativedelta import *
为了在日期中添加特定的时间,你可以继续使用timedelta
来表示简单的东西,例如。
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))
这绝不是可用内容的详尽清单。 文档可在此处获取:https://dateutil.readthedocs.org/en/latest/
答案 1 :(得分:2)
这个怎么样?
def add_one_month(orig_date):
# advance year and month by one month
new_year = orig_date.year
new_month = orig_date.month + 1
# note: in datetime.date, months go from 1 to 12
if new_month > 12:
new_year += 1
new_month -= 12
new_day = orig_date.day
# while day is out of range for month, reduce by one
while True:
try:
new_date = datetime.date(new_year, new_month, new_day)
except ValueError as e:
new_day -= 1
else:
break
return new_date
修改强>
改进版本:
calendar.monthrange
模块中的calendar
:import datetime
import calendar
def add_one_month(orig_date):
# advance year and month by one month
new_year = orig_date.year
new_month = orig_date.month + 1
# note: in datetime.date, months go from 1 to 12
if new_month > 12:
new_year += 1
new_month -= 12
last_day_of_month = calendar.monthrange(new_year, new_month)[1]
new_day = min(orig_date.day, last_day_of_month)
return orig_date.replace(year=new_year, month=new_month, day=new_day)
答案 2 :(得分:0)
问题:在当前版本的Python中是否有一种简单的方法可以做到这一点?
答:在当前版本的Python中没有简单(直接)的方法。
参考:请参阅docs.python.org/2/library/datetime.html,第8.1.2节。 timedelta对象。正如我们可以从中理解的那样,我们不能直接增加月份,因为它不是统一的时间单位。
另外:如果你想要第一天 - >第一天和最后一天 - >最后一天映射你应该分别处理不同月份。
答案 3 :(得分:-4)
>>> now
datetime.datetime(2016, 1, 28, 18, 26, 12, 980861)
>>> later = now.replace(month=now.month+1)
>>> later
datetime.datetime(2016, 2, 28, 18, 26, 12, 980861)
编辑:失败
y = datetime.date(2016, 1, 31); y.replace(month=2) results in ValueError: day is out of range for month
Ther并不是一种简单的方法,但您可以使用自己的功能,如下所示。