- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在给定的日期上加一个月
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
偏移量,只有 MonthBegin
或 MonthEnd
我也看到这个帖子 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
对象。请注意,下面的代码仅适用于数年和数月,我认为如果您使用低于该代码的任何内容(天数、小时数等),它就不会起作用。您可以轻松修改此函数以将 years
和 months
作为参数,然后在函数本身内部构造 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/
我是一名优秀的程序员,十分优秀!