如果 end_date 落在一个月的最后一天,如何在不跨越月份边界的情况下从 end_date 中减去完整月份?
How to subtract full months from end_date without crossing the month boundary if end_date falls on the last day of a month?
我的目标是在结束日期落在一个月的最后一天时,从给定的结束日期减去 2 个完整的月份而不跨越最后一个月的边界。
例如,如果 end_date
是 2011-02-28,我从中减去 2 个整月,则开始日期应该是 2011-01-01,因为 2011 年 2 月已经全部发生。需要的额外一个月是 2011 年 1 月。我尝试使用 dateutil.relativedelta
完成此操作,如下所示:
from dateutil.relativedelta import relativedelta
from dateutil import parser
end_date_1 = parser.parse("2011-02-28").date()
end_date_2 = parser.parse("2011-02-15").date()
time_period = relativedelta(months=2)
start_date_1 = end_date_1 - time_period
start_date_2 = end_date_2 - time_period
print(start_date_1)
print(start_date_2)
这给出了以下输出:
2010-12-28 # should be 2011-01-01
2010-12-15 # correct!
这里默认每个月的天数是30天。因此,您得到的日期是 end_date 之前 60 天,如 start_date。
您可以对两个日期使用单独的 time_period,并传递天数而不是月份以获得所需的结果。
time_period_1 = relativedelta(days = 58)
time_period = relativedelta(months = 2)
start_date_1 = end_date_1 - time_period_1
start_date_2 = end_date_2 - time_period
一种方法是检查日期是否是该月的最后一天
from dateutil.relativedelta import relativedelta
from dateutil import parser
def start_date(end_date, mdelta):
next_day = end_date + relativedelta(days=1) # get the next day to determine if d is the last date of month
return (next_day if next_day.day == 1 else end_date) + relativedelta(months=mdelta) # so add relativedelta to d or d1 according to the condition
for d in ['2011-02-28', '2011-02-15', '2011-04-30', '2011-01-30']:
print(start_date(parser.parse(d).date(), -2))
输出:
2011-01-01
2010-12-15
2011-03-01
2010-11-30
我的目标是在结束日期落在一个月的最后一天时,从给定的结束日期减去 2 个完整的月份而不跨越最后一个月的边界。
例如,如果 end_date
是 2011-02-28,我从中减去 2 个整月,则开始日期应该是 2011-01-01,因为 2011 年 2 月已经全部发生。需要的额外一个月是 2011 年 1 月。我尝试使用 dateutil.relativedelta
完成此操作,如下所示:
from dateutil.relativedelta import relativedelta
from dateutil import parser
end_date_1 = parser.parse("2011-02-28").date()
end_date_2 = parser.parse("2011-02-15").date()
time_period = relativedelta(months=2)
start_date_1 = end_date_1 - time_period
start_date_2 = end_date_2 - time_period
print(start_date_1)
print(start_date_2)
这给出了以下输出:
2010-12-28 # should be 2011-01-01
2010-12-15 # correct!
这里默认每个月的天数是30天。因此,您得到的日期是 end_date 之前 60 天,如 start_date。 您可以对两个日期使用单独的 time_period,并传递天数而不是月份以获得所需的结果。
time_period_1 = relativedelta(days = 58)
time_period = relativedelta(months = 2)
start_date_1 = end_date_1 - time_period_1
start_date_2 = end_date_2 - time_period
一种方法是检查日期是否是该月的最后一天
from dateutil.relativedelta import relativedelta
from dateutil import parser
def start_date(end_date, mdelta):
next_day = end_date + relativedelta(days=1) # get the next day to determine if d is the last date of month
return (next_day if next_day.day == 1 else end_date) + relativedelta(months=mdelta) # so add relativedelta to d or d1 according to the condition
for d in ['2011-02-28', '2011-02-15', '2011-04-30', '2011-01-30']:
print(start_date(parser.parse(d).date(), -2))
输出:
2011-01-01
2010-12-15
2011-03-01
2010-11-30