python datetime 加一个月_在当前日期加一年PYTHON

这篇博客讨论了如何在Python中使用datetime模块为日期加上一年。提供了多种方法,包括使用dateutil库的relativedelta,直接操作datetime对象的年份属性,以及通过计算天数来增加年份。博客还包括了处理闰年的注意事项。
Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在当前日期加一年PYTHON

我已经使用以下变量从数据库中获取了一个日期

{{ i.operation_date }}

我得到了一个像

April 1, 2013

我需要在上面加上一年,这样我才能得到

April 1, 2014

请提出建议,我该怎么做?

user2106353 asked 2020-02-05T20:29:30Z

7个解决方案

100 votes

AGSM的答案显示了使用python-dateutil软件包解决此问题的便捷方法。 但是,如果您不想安装该软件包怎么办? 您可以像这样在香草Python中解决问题:

from datetime import date

def add_years(d, years):

"""Return a date that's `years` years after the date (or datetime)

object `d`. Return the same calendar date (month and day) in the

destination year, if it exists, otherwise use the following day

(thus changing February 29 to March 1).

"""

try:

return d.replace(year = d.year + years)

except ValueError:

return d + (date(d.year + years, 1, 1) - date(d.year, 1, 1))

如果您想要其他可能性(从2月29日更改为2月28日),那么最后一行应更改为:

return d + (date(d.year + years, 3, 1) - date(d.year, 3, 1))

Gareth Rees answered 2020-02-05T20:29:54Z

46 votes

您可以使用Python-dateutil的datetime来增加.replace()对象,同时保持对leap年和月长之类的内容的敏感性。 如果已有的话,Python-dateutil与matplotlib打包在一起。 您可以执行以下操作:

from dateutil.relativedelta import relativedelta

new_date = old_date + relativedelta(years=1)

(此答案由@Max提供给类似的问题)。

但是,如果您的日期是字符串(即还不是datetime对象),则可以使用datetime进行转换:

from datetime import datetime

from dateutil.relativedelta import relativedelta

your_date_string = "April 1, 2012"

format_string = "%B %d, %Y"

datetime_object = datetime.strptime(your_date_string, format_string).date()

new_date = datetime_object + relativedelta(years=1)

new_date_string = datetime.strftime(new_date, format_string).replace(' 0', ' ')

datetime将包含“ 2013年4月1日”。

注意:不幸的是,datetime仅将日期值输出为“十进制数”,即,如果它们是一位数字,则带有前导零。 最后的.replace()是一种解决方法,用于处理从@Alex Martelli复制的此问题(有关此问题的其他方法,请参阅此问题)。

ASGM answered 2020-02-05T20:30:33Z

9 votes

从您的问题看来,您只是想增加给定日期的年份,而不用担心leap年的影响。 您可以通过访问其成员年份来使用日期类来执行此操作。

from datetime import date

startDate = date(2012, 12, 21)

# reconstruct date fully

endDate = date(startDate.year + 1, startDate.month, startDate.day)

# replace year only

endDate = startDate.replace(startDate.year + 1)

如果您在创建给定格式的格式时遇到问题,请告诉我们。

DrCurrency answered 2020-02-05T20:30:57Z

2 votes

当我需要增加数月或数年并且不想导入更多库时,这就是我要做的。只需创建一个datetime.date()对象,调用add_month(date)添加一个月,并调用add_year(date)添加一年。

import datetime

__author__ = 'Daniel Margarido'

# Check if the int given year is a leap year

# return true if leap year or false otherwise

def is_leap_year(year):

if (year % 4) == 0:

if (year % 100) == 0:

if (year % 400) == 0:

return True

else:

return False

else:

return True

else:

return False

THIRTY_DAYS_MONTHS = [4, 6, 9, 11]

THIRTYONE_DAYS_MONTHS = [1, 3, 5, 7, 8, 10, 12]

# Inputs -> month, year Booth integers

# Return the number of days of the given month

def get_month_days(month, year):

if month in THIRTY_DAYS_MONTHS: # April, June, September, November

return 30

elif month in THIRTYONE_DAYS_MONTHS: # January, March, May, July, August, October, December

return 31

else: # February

if is_leap_year(year):

return 29

else:

return 28

# Checks the month of the given date

# Selects the number of days it needs to add one month

# return the date with one month added

def add_month(date):

current_month_days = get_month_days(date.month, date.year)

next_month_days = get_month_days(date.month + 1, date.year)

delta = datetime.timedelta(days=current_month_days)

if date.day > next_month_days:

delta = delta - datetime.timedelta(days=(date.day - next_month_days) - 1)

return date + delta

def add_year(date):

if is_leap_year(date.year):

delta = datetime.timedelta(days=366)

else:

delta = datetime.timedelta(days=365)

return date + delta

# Validates if the expected_value is equal to the given value

def test_equal(expected_value, value):

if expected_value == value:

print "Test Passed"

return True

print "Test Failed : " + str(expected_value) + " is not equal to " str(value)

return False

# Test leap year

print "---------- Test leap year ----------"

test_equal(True, is_leap_year(2012))

test_equal(True, is_leap_year(2000))

test_equal(False, is_leap_year(1900))

test_equal(False, is_leap_year(2002))

test_equal(False, is_leap_year(2100))

test_equal(True, is_leap_year(2400))

test_equal(True, is_leap_year(2016))

# Test add month

print "---------- Test add month ----------"

test_equal(datetime.date(2016, 2, 1), add_month(datetime.date(2016, 1, 1)))

test_equal(datetime.date(2016, 6, 16), add_month(datetime.date(2016, 5, 16)))

test_equal(datetime.date(2016, 3, 15), add_month(datetime.date(2016, 2, 15)))

test_equal(datetime.date(2017, 1, 12), add_month(datetime.date(2016, 12, 12)))

test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 31)))

test_equal(datetime.date(2015, 3, 1), add_month(datetime.date(2015, 1, 31)))

test_equal(datetime.date(2016, 3, 1), add_month(datetime.date(2016, 1, 30)))

test_equal(datetime.date(2016, 4, 30), add_month(datetime.date(2016, 3, 30)))

test_equal(datetime.date(2016, 5, 1), add_month(datetime.date(2016, 3, 31)))

# Test add year

print "---------- Test add year ----------"

test_equal(datetime.date(2016, 2, 2), add_year(datetime.date(2015, 2, 2)))

test_equal(datetime.date(2001, 2, 2), add_year(datetime.date(2000, 2, 2)))

test_equal(datetime.date(2100, 2, 2), add_year(datetime.date(2099, 2, 2)))

test_equal(datetime.date(2101, 2, 2), add_year(datetime.date(2100, 2, 2)))

test_equal(datetime.date(2401, 2, 2), add_year(datetime.date(2400, 2, 2)))

Daniel Margarido answered 2020-02-05T20:31:18Z

1 votes

另一种方法是使用熊猫“ DateOffset”类

链接:-[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.tseries.offsets.DateOffset.html]

使用ASGM的代码(答案上方):

from datetime import datetime

import pandas as pd

your_date_string = "April 1, 2012"

format_string = "%B %d, %Y"

datetime_object = datetime.strptime(your_date_string, format_string).date()

new_date = datetime_object + pd.DateOffset(years=1)

new_date.date()

它将返回带有添加年份的datetime对象。

像这样的东西:

datetime.date(2013, 4, 1)

Siddharth answered 2020-02-05T20:31:55Z

0 votes

看这个:

#!/usr/bin/python

import datetime

def addYears(date, years):

result = date + datetime.timedelta(366 * years)

if years > 0:

while result.year - date.year > years or date.month < result.month or date.day < result.day:

result += datetime.timedelta(-1)

elif years < 0:

while result.year - date.year < years or date.month > result.month or date.day > result.day:

result += datetime.timedelta(1)

print "input: %s output: %s" % (date, result)

return result

用法示例:

addYears(datetime.date(2012,1,1), -1)

addYears(datetime.date(2012,1,1), 0)

addYears(datetime.date(2012,1,1), 1)

addYears(datetime.date(2012,1,1), -10)

addYears(datetime.date(2012,1,1), 0)

addYears(datetime.date(2012,1,1), 10)

和这个例子的输出:

input: 2012-01-01 output: 2011-01-01

input: 2012-01-01 output: 2012-01-01

input: 2012-01-01 output: 2013-01-01

input: 2012-01-01 output: 2002-01-01

input: 2012-01-01 output: 2012-01-01

input: 2012-01-01 output: 2022-01-01

ArkadiuszG answered 2020-02-05T20:32:24Z

-1 votes

如果尚未将其转换为python datetime对象。 然后添加deltatime

one_years_later = Your_date + datetime.timedelta(days=(years*days_per_year))

对于您的情况,天数= 365。

您可以检查年份是leap年还是否,并相应地调整天数

您可以根据需要添加任意多年

MHZ answered 2020-02-05T20:32:57Z

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值