在Python中为日期添加5天


366

我有一个日期"10/10/11(m-d-y)",我想使用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

12
一般提示:如果收到错误消息name 'timedelta' is not defined,则表示您尚未定义timedelta任何地方。Python通常会提供有关其错误消息的丰富信息。
卡特里尔2011年

1
搜索无效?所有这些代码示例都会有所帮助:stackoverflow.com/search?q=python+timedelta。与此类似,似乎有200多个问题。
S.Lott


9
您想增加5天,但是您有timedelta(days = 10)…我很困惑10的来源以及为什么不是5
FeifanZ

Answers:


556

先前的答案是正确的,但是通常这样做是更好的做法:

import datetime

然后,您将拥有datetime.timedelta

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

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

7
datetime.datetime-为什么要两次?
paulmorriss 2014年

59
像“从datetime导入datetime,timedelta”这样的导入将增加代码的可读性
Manel Clos

8
@paulmorriss:您正在模块中strptimedatetime类上调用方法datetime,因此需要指定datetime.datetime
Graeme Perrow

6
我们都可以同意将一个通用类命名为与其包含的模块相同的名称是一个愚蠢的想法吗?什么datetime啊 您不能依靠约定来知道,但始终必须查看导入。
熊加米奥夫

8
那里有长尾遗留问题。“应该”是from datetime import DateTime因为类是CamelCased,但日期时间在PEP8之前。
亚伦·麦克米林

120

导入timedeltadate首先。

from datetime import timedelta, date

date.today()会返回今天的日期时间,可能是您想要的

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

11
datetime.date.today()而不是Date.today()
elsadek 2014年

2
@ dan-klasson它对我不起作用,date对象没有timedelta方法。您正在使用哪个Python版本?
DrTyrsa

@DrTyrsa我不好。应该是:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

如果您碰巧已经在使用pandas,则可以通过不指定格式来节省一些空间:

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

对我来说很好。谢谢
renny '19

12

我想您缺少这样的东西:

from datetime import timedelta

12

这是另一种使用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


10

如果要立即添加日期,可以使用此代码

from datetime import datetime
from datetime import timedelta


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

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
好的代码。但是您的IF不需要测试get_date中的addDays
Eduardo

6

为了减少冗长的代码,并避免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


0

使用timedeltas可以做到:

import datetime
today=datetime.date.today()


time=datetime.time()
print("today :",today)

# One day different .
five_day=datetime.timedelta(days=5)
print("one day :",five_day)
#output - 1 day , 00:00:00


# five day extend .
fitfthday=today+five_day
print("fitfthday",fitfthday)


# five day extend .
fitfthday=today+five_day
print("fitfthday",fitfthday)
#output - 
today : 2019-05-29
one day : 5 days, 0:00:00
fitfthday 2019-06-03

0

通常,您现在没有答案,但是也许我创建的我的课程也会有所帮助。对我来说,它可以解决我在Pyhon项目中曾经遇到的所有要求。

class GetDate:
    def __init__(self, date, format="%Y-%m-%d"):
        self.tz = pytz.timezone("Europe/Warsaw")

        if isinstance(date, str):
            date = datetime.strptime(date, format)

        self.date = date.astimezone(self.tz)

    def time_delta_days(self, days):
        return self.date + timedelta(days=days)

    def time_delta_hours(self, hours):
        return self.date + timedelta(hours=hours)

    def time_delta_seconds(self, seconds):
        return self.date + timedelta(seconds=seconds)

    def get_minimum_time(self):
        return datetime.combine(self.date, time.min).astimezone(self.tz)

    def get_maximum_time(self):
        return datetime.combine(self.date, time.max).astimezone(self.tz)

    def get_month_first_day(self):
        return datetime(self.date.year, self.date.month, 1).astimezone(self.tz)

    def current(self):
        return self.date

    def get_month_last_day(self):
        lastDay = calendar.monthrange(self.date.year, self.date.month)[1]
        date = datetime(self.date.year, self.date.month, lastDay)
        return datetime.combine(date, time.max).astimezone(self.tz)

如何使用它

  1. self.tz = pytz.timezone("Europe/Warsaw") -在此处定义要在项目中使用的时区
  2. GetDate("2019-08-08").current()-这会将您的字符串日期转换为具有您在pt 1中定义的时区的时间敏感对象。默认字符串格式为,format="%Y-%m-%d"但可以随时更改。(例如。GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current()
  3. GetDate("2019-08-08").get_month_first_day() 返回给定日期(字符串或对象)月份的第一天
  4. GetDate("2019-08-08").get_month_last_day() 返回上个月的给定日期
  5. GetDate("2019-08-08").minimum_time() 返回给定日期的开始日期
  6. GetDate("2019-08-08").maximum_time() 返回给定日期的一天结束
  7. GetDate("2019-08-08").time_delta_days({number_of_days})返回给定的日期+添加{天数}(您也可以致电:GetDate(timezone.now()).time_delta_days(-1)昨天)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) 与pt 7类似,但工作时间较长
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) 类似于pt 7,但工作几秒钟

0

有时我们需要使用按日期和日期进行搜索。如果我们使用date__range,那么我们需要添加1天和to_date,否则queryset将为空。

例:

从datetime导入timedelta

from_date = parse_date(request.POST ['from_date'])

to_date = parse_date(request.POST ['to_date'])+ timedelta(days = 1)

Attenance_list = models.DailyAttendance.objects.filter(attdate__range = [from_date,to_date])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.