在Python中给日期添加天数

642
我有一个日期“10/10/11(月-日-年)”,我想使用Python脚本在此基础上增加5天。请考虑一个通用解决方案,可以适用于月末的情况。
我正在使用以下代码:
import re
from datetime import datetime

StartDate = "10/10/11"

Date = datetime.strptime(StartDate, "%m/%d/%y")

print Date -> 正在打印 '2011-10-10 00:00:00'

现在我想在这个日期上加5天。我使用了以下代码:

EndDate = Date.today()+timedelta(days=10)

这是返回的错误信息:
name 'timedelta' is not defined

24
通用提示:如果你收到错误信息“name 'timedelta' is not defined”,这意味着你在任何地方都没有定义过timedelta。Python通常会给出详细的错误提示信息。 - Katriel
1
搜索不起作用了吗?所有这些代码示例都将对您有所帮助:http://stackoverflow.com/search?q=python+timedelta。似乎有超过200个与此类似的问题。 - S.Lott
1
可能是[使用循环、范围和切片在Python中添加日期的天数]的重复问题(http://stackoverflow.com/questions/5206759/add-days-to-a-date-in-python-using-loops-ranges-and-slicing) - S.Lott
14
你想增加五天,但是你使用了timedelta(days=10)……我不确定这个“10”从哪里来的,也不知道为什么不是“5”。 - FeifanZ
同样的问题,排除周末是什么意思? - KarSho
18个回答

923

前面的回答是正确的,但通常更好的做法是:

import datetime

然后你可以使用datetime.timedelta

date_1 = datetime.datetime.strptime(start_date, "%m/%d/%y")

end_date = date_1 + datetime.timedelta(days=10)

11
为什么datetime.datetime中出现两次datetime? - paulmorriss
116
像 "from datetime import datetime, timedelta" 这样的导入会增加代码的可读性。 - Manel Clos
13
你正在在datetime模块中的datetime类上调用strptime方法,因此你需要指定为datetime.datetime - Graeme Perrow
22
我们能否都认同,将一个常用的类命名为包含它的模块相同的名称是一个愚蠢的想法?“datetime”是什么?你不能依赖约定来知道,而总是要查看导入。 - Xiong Chiamiov
33
长尾遗留问题在这里。因为类是驼峰式命名的,所以应该写成 from datetime import DateTime,但 datetime 模块在 PEP8 规范之前就存在了。 - Aaron McMillin
显示剩余5条评论

218

首先导入timedeltadate

from datetime import timedelta, date

date.today() 返回当天日期时间,您可以使用 timedelta 将其与之相加:

end_date = date.today() + timedelta(days=10)

14
使用datetime.date.today()代替Date.today()。 - elsadek
2
@dan-klasson,这对我不起作用,date对象没有timedelta方法。您使用的是哪个Python版本? - DrTyrsa
@DrTyrsa 不好意思,应该是:from datetime import timedelta, date; date.today() + timedelta(days=10) - dan-klasson
我正在使用Python 3.7。对我有用。非常感谢。 - Geshan Ravindu

44

如果你已经在使用pandas,你可以不指定格式来节省一些空间:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)

对我来说运行良好。谢谢。 - renny
7
注意,仅为此安装Pandas 是严重过度的。 - Christopher Hunter
这对我来说是最好的答案,因为我已经在使用pandas了,不想再导入另一个库。 - autonopy

40

这可能有帮助:

from datetime import date, timedelta
date1 = date(2011, 10, 10)
date2 = date1 + timedelta(days=5)
print (date2)

第三行有一个小错别字,应该是 date2 = date1 + timedelta(days=5)。 - Vyshak Puthusseri
2
你也可以使用 date1 += timedelta(days=5) - not2qubit

19

如果你想现在给日期添加天数,你可以使用以下代码

from datetime import datetime
from datetime import timedelta


date_now_more_5_days = (datetime.now() + timedelta(days=5) ).strftime('%Y-%m-%d')

15

这里有另一种使用 dateutil的relativedelta 添加日期的方法。

from datetime import datetime
from dateutil.relativedelta import relativedelta

print 'Today: ',datetime.now().strftime('%d/%m/%Y %H:%M:%S') 
date_after_month = datetime.now()+ relativedelta(days=5)
print 'After 5 Days:', date_after_month.strftime('%d/%m/%Y %H:%M:%S')

输出:

今天:25/06/2015 15:56:09

5天后:30/06/2015 15:56:09


1
relativedelta在进行月份、年份等操作时非常有用。 - forkadam

14

我猜你可能缺少了类似这样的内容:

from datetime import timedelta

9
这是一个获取从现在开始指定天数后的日期的函数。
import datetime

def get_date(dateFormat="%d-%m-%Y", addDays=0):

    timeNow = datetime.datetime.now()
    if (addDays!=0):
        anotherTime = timeNow + datetime.timedelta(days=addDays)
    else:
        anotherTime = timeNow

    return anotherTime.strftime(dateFormat)

使用方法:

addDays = 3 #days
output_format = '%d-%m-%Y'
output = get_date(output_format, addDays)
print output

1
好的代码。但是你在 get_date 函数中测试 addDays 的 IF 语句是不必要的。 - Eduardo

7
为了让代码更简洁,避免datetime和datetime.datetime之间的名称冲突,您应该使用CamelCase命名类。
from datetime import datetime as DateTime, timedelta as TimeDelta

所以您可以按照以下方式操作,我认为这更加清晰易懂。
date_1 = DateTime.today() 
end_date = date_1 + TimeDelta(days=10)

此外,如果你以后想要 import datetime,也不会有命名冲突的问题。

4

尝试这样做:

将5天添加到当前日期。

from datetime import datetime, timedelta

current_date = datetime.now()
end_date = current_date + timedelta(days=5) # Adding 5 days.
end_date_formatted = end_date.strftime('%Y-%m-%d')
print(end_date_formatted)

从当前日期减去5天。

from datetime import datetime, timedelta

current_date = datetime.now()
end_date = current_date + timedelta(days=-5) # Subtracting 5 days.
end_date_formatted = end_date.strftime('%Y-%m-%d')
print(end_date_formatted)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接