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

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)

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)

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)

Funcionou bem para mim. Graças
renny

12

Eu acho que você está perdendo algo assim:

from datetime import timedelta

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


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

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

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.


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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.