gpt4 book ai didi

python - 使用 Python 将一个月添加到给定日期(后一天舍入)

转载 作者:太空狗 更新时间:2023-10-29 20:25:32 25 4
gpt4 key购买 nike

我想在给定的日期上加一个月

import datetime
dt = datetime.datetime(year=2014, month=5, day=2)

所以我应该得到

datetime.datetime(year=2014, month=6, day=2)

但与

dt = datetime.datetime(year=2015, month=1, day=31)

我应该得到

datetime.datetime(year=2015, month=3, day=1)

因为没有 2015-02-31(而且我希望我的结果在 后的一天是整数)

有些月份有 31 天,有些月份有 30 天,有些月份有 29 天,有些月份有 28 天!

所以添加 datetime.timedelta 可能不是一个好的做法(因为我们不知道要添加的天数)

我注意到 Pandas 有一个有趣的概念 DateOffset

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects

但我没有找到 Month 偏移量,只有 MonthBeginMonthEnd

我也看到这个帖子 How do I calculate the date six months from the current date using the datetime Python module?

所以我尝试了 dateutil.relativedelta 但是

from dateutil.relativedelta import relativedelta
datetime.datetime(year=2015, month=1, day=31)+relativedelta(months=1)

返回

datetime.datetime(2015, 2, 28, 0, 0)

所以结果在 前一天四舍五入。

之后是否有一种(干净的)方法来圆整一天?

编辑:我给出了一个要添加一个月的示例,但我也希望能够添加例如:2 年零 6 个月(使用 relativedelta(years=2, months=6))

最佳答案

您可以使用 dateutil.relativedelta.relativedelta并手动检查 datetime.day属性,如果原始日期大于新日期,则添加一天。

下面的函数接受一个datetime 对象和relativedelta 对象。请注意,下面的代码仅适用于数年和数月,我认为如果您使用低于该代码的任何内容(天数、小时数等),它就不会起作用。您可以轻松修改此函数以将 yearsmonths 作为参数,然后在函数本身内部构造 relativedelta

from datetime import datetime
from dateutil.relativedelta import relativedelta

def add_time(d, rd):
day = relativedelta(days=+1)

out = d + rd
if d.day > out.day:
out = out + day

return out

# Check that it "rolls over"
print(add_time(datetime(year=2015, month=1, day=29), relativedelta(years=+4, months=+1))) # 2019-03-01 00:00:00
print(add_time(datetime(year=2015, month=3, day=31), relativedelta(years=+0, months=+2))) # 2015-05-01 00:00:00

# Check that it handles "normal" scenarios
print(add_time(datetime(year=2015, month=6, day=19), relativedelta(months=+1))) # 2015-07-19 00:00:00
print(add_time(datetime(year=2015, month=6, day=30), relativedelta(years=+2, months=+1))) # 2017-07-30 00:00:00

# Check across years
print(add_time(datetime(year=2015, month=12, day=25), relativedelta(months=+1))) # 2016-01-25 00:00:00

# Check leap years
print(add_time(datetime(year=2016, month=1, day=29), relativedelta(years=+4, months=+1))) # 2020-02-29 00:00:00

关于python - 使用 Python 将一个月添加到给定日期(后一天舍入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com