Adicionando 5 dias a uma data no Python

366

Eu tenho uma data "10/10/11(m-d-y)"e quero adicionar 5 dias a ela usando um script Python. Considere uma solução geral que funcione também no final do mês.

Estou usando o seguinte código:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> está imprimindo '2011-10-10 00:00:00'

Agora eu quero adicionar 5 dias a esta data. Eu usei o seguinte código:

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

O que retornou este erro:

name 'timedelta' is not defined
MuraliKrishna
fonte
12
Pista geral: se você receber o erro name 'timedelta' is not defined, isso significa que você não definiu em timedeltanenhum lugar. O Python geralmente é bastante informativo sobre suas mensagens de erro.
Katriel
11
A pesquisa não funcionou? Todos esses exemplos de código teriam ajudado: stackoverflow.com/search?q=python+timedelta . Parece haver mais de 200 perguntas como esta.
31511 S.Lott
9
Você deseja adicionar cinco dias, mas então você tem timedelta (dias = 10) ... Estou confuso sobre onde o 10 veio e por que não é 5
FeifanZ

Respostas:

556

As respostas anteriores estão corretas, mas geralmente é uma prática melhor:

import datetime

Então você terá, usando datetime.timedelta:

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

end_date = date_1 + datetime.timedelta(days=10)
Botond Béres
fonte
7
datetime.datetime - por que duas vezes?
Paulmorriss
59
importação como "a partir de data e hora de data e hora de importação, timedelta" acrescentaria readibility ao código
Manel Clos
8
@paulmorriss: você está chamando o strptimemétodo na datetimeclasse no datetimemódulo, então você precisa especificar datetime.datetime.
Graeme Perrow
6
Todos podemos concordar que nomear uma classe comumente usada com o mesmo nome que o módulo que a contém é uma idéia idiota? O que é datetime? Você não pode confiar na convenção para saber, mas sempre precisa observar as importações.
Xiong Chiamiov
8
Problema legado de cauda longa lá. "deveria" ser from datetime import DateTimeporque as classes são CamelCased, mas a data e hora precede o PEP8.
Aaron McMillin
120

Importe timedeltae dateprimeiro.

from datetime import timedelta, date

E date.today()retornará a data e hora de hoje, pode ser que você queira

EndDate = date.today() + timedelta(days=10)
DrTyrsa
fonte
11
datetime.date.today () em vez de Date.today ()
elsadek
2
@ dan-klasson Não funciona para mim, o dateobjeto não tem timedeltamétodo. Qual versão do Python você está usando?
DrTyrsa
@DrTyrsa My bad. Deve ser:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson
21

Se você já estiver usando pandas , poderá economizar um pouco de espaço não especificando o formato:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)
fantabolous
fonte
Funcionou bem para mim. Graças
renny
12

Eu acho que você está perdendo algo assim:

from datetime import timedelta
vstm
fonte
12

Aqui está outro método para adicionar dias na data usando o relativedelta do dateutil .

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')

Resultado:

Hoje: 25/06/2015 15:56:09

Após 5 dias: 30/06/2015 15:56:09

Atul Arvind
fonte
10

Se você deseja adicionar dias até agora, pode usar este código

from datetime import datetime
from datetime import timedelta


date_now_more_5_days = (datetime.now() + timedelta(days=5) ).strftime('%Y-%m-%d')
Jorge Omar MH
fonte
9

Aqui está uma função de obter a partir de agora + dias especificados

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)

Uso:

addDays = 3 #days
output_format = '%d-%m-%Y'
output = get_date(output_format, addDays)
print output
Guray Celik
fonte
11
Bom código. Mas o IF para testar os AddDays em get_date não é necessário
Eduardo
6

Para ter um código menos detalhado e evitar conflitos de nome entre datetime e datetime.datetime , você deve renomear as classes com nomes do CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Então você pode fazer o seguinte, o que eu acho mais claro.

date_1 = DateTime.today() 
end_date = date_1 + TimeDelta(days=10)

Além disso, não haveria conflito de nomes se você quiser import datetimemais tarde.

toto_tico
fonte
0

usando timedeltas você pode fazer:

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
sameer_nubia
fonte
0

Geralmente você já teve uma resposta agora, mas talvez minha turma que criei também seja útil. Para mim, resolve todos os meus requisitos que já tive em meus projetos de 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)

Como usá-lo

  1. self.tz = pytz.timezone("Europe/Warsaw") - aqui você define o fuso horário que deseja usar no projeto
  2. GetDate("2019-08-08").current()- isso converterá a data da seqüência de caracteres em objeto que reconhece o horário com o fuso horário definido na pt 1. O formato padrão da sequência é, format="%Y-%m-%d"mas fique à vontade para alterá-lo. (por exemplo GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() retorna data (string ou objeto) mês primeiro dia
  4. GetDate("2019-08-08").get_month_last_day() retorna data mês mês último dia
  5. GetDate("2019-08-08").minimum_time() retorna data e dia início
  6. GetDate("2019-08-08").maximum_time() retorna a data final do dia
  7. GetDate("2019-08-08").time_delta_days({number_of_days})retorna a data especificada + adiciona {número de dias} (você também pode ligar: GetDate(timezone.now()).time_delta_days(-1)ontem)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) semelhante ao pt 7, mas trabalhando horas
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) semelhante ao pt 7, mas trabalhando em segundos
Michael Stachura
fonte
0

Algum tempo, precisamos usar a pesquisa de data para data. Se usarmos date_range, precisamos adicionar 1 dia com to_date, caso contrário, o queryyset ficará vazio.

Exemplo:

da data e hora da importação timedelta

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

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

lista de presença = models.DailyAttendance.objects.filter (attdate__range = [from_date, to_date])

jahurul25
fonte