Dodanie 5 dni do daty w Pythonie

366

Mam datę "10/10/11(m-d-y)"i chcę dodać do niej 5 dni za pomocą skryptu Python. Rozważ ogólne rozwiązanie, które działa również na koniec miesiąca.

Używam następującego kodu:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> drukuje '2011-10-10 00:00:00'

Teraz chcę dodać 5 dni do tej daty. Użyłem następującego kodu:

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

Który zwrócił ten błąd:

name 'timedelta' is not defined
MuraliKrishna
źródło
12
Ogólna wskazówka: jeśli pojawi się błąd name 'timedelta' is not defined, oznacza to, że timedeltanigdzie nie zdefiniowałeś . Python jest zwykle bardzo pouczający o komunikatach o błędach.
Katriel
1
Wyszukiwanie nie działa? Wszystkie te przykłady kodu pomogłyby: stackoverflow.com/search?q=python+timedelta . Wydaje się, że jest ponad 200 pytań takich jak to.
S.Lott,
9
Chcesz dodać pięć dni, ale potem masz timedelta (dni = 10)… Nie jestem pewien, skąd pochodzi 10 i dlaczego nie jest 5
FeifanZ

Odpowiedzi:

556

Poprzednie odpowiedzi są poprawne, ale ogólnie lepszą praktyką jest:

import datetime

Będziesz miał, używając datetime.timedelta:

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

end_date = date_1 + datetime.timedelta(days=10)
Botond Béres
źródło
7
datetime.datetime - dlaczego dwa razy?
paulmorriss,
59
importowanie w stylu „z importu z datetime datetime, timedelta” zwiększyłoby czytelność kodu
Manel Clos,
8
@paulmorriss: Wywołujesz strptimemetodę na datetimeklasie w datetimemodule, więc musisz ją określić datetime.datetime.
Graeme Perrow,
6
Czy wszyscy możemy się zgodzić, że nazywanie powszechnie używanej klasy taką samą nazwą jak moduł ją zawierający to głupi pomysł? Co to jest datetime? Nie możesz polegać na konwencji, ale zawsze musisz spojrzeć na import.
Xiong Chiamiov
8
Problem z długimi ogonami. tak powinno być, from datetime import DateTimeponieważ klasy są w CamelCased, ale datetime poprzedza PEP8.
Aaron McMillin
120

Importuj timedeltai datenajpierw.

from datetime import timedelta, date

I date.today()zwróci dzisiejszą datę i godzinę, może chcesz

EndDate = date.today() + timedelta(days=10)
DrTyrsa
źródło
11
datetime.date.today () zamiast Date.today ()
elsadek
2
@ dan-klasson To nie działa dla mnie, dateobiekt nie ma timedeltametody. Jakiej wersji Python używasz?
DrTyrsa
@DrTyrsa My bad. Powinno być:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson
21

Jeśli akurat używasz już pand , możesz zaoszczędzić trochę miejsca, nie określając formatu:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)
fantastyczny
źródło
Działa dobrze dla mnie. Dzięki
renny,
12

Chyba brakuje ci czegoś takiego:

from datetime import timedelta
vstm
źródło
12

Oto kolejna metoda dodawania dni z datą za pomocą relativedelta 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')

Wynik:

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

Po 5 dniach: 30.06.2015 15:56:09

Atul Arvind
źródło
10

Jeśli chcesz teraz dodać dni, możesz użyć tego kodu

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
źródło
9

Oto funkcja uzyskiwania od teraz + określonych dni

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)

Stosowanie:

addDays = 3 #days
output_format = '%d-%m-%Y'
output = get_date(output_format, addDays)
print output
Guray Celik
źródło
1
Dobry kod Ale twój IF, aby przetestować addDays w get_date, nie jest konieczny
Eduardo
6

Aby mieć mniej szczegółowy kod i uniknąć konfliktów nazw między datetime i datetime.datetime , należy zmienić nazwy klas na nazwy CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Możesz więc wykonać następujące czynności, które moim zdaniem są wyraźniejsze.

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

Ponadto nie będzie konfliktu nazw, jeśli chcesz import datetimepóźniej.

toto_tico
źródło
0

używając timedeltas możesz zrobić:

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
same_nubia
źródło
0

Generalnie nie masz już odpowiedzi, ale może moja klasa, którą stworzyłem, również będzie pomocna. Dla mnie rozwiązuje wszystkie moje wymagania, jakie kiedykolwiek miałem w moich projektach 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)

Jak tego użyć

  1. self.tz = pytz.timezone("Europe/Warsaw") - tutaj definiujesz strefę czasową, której chcesz użyć w projekcie
  2. GetDate("2019-08-08").current()- spowoduje to konwersję daty ciągu na obiekt uwzględniający czas w strefie czasowej zdefiniowanej w pkt 1. Domyślny format ciągu można format="%Y-%m-%d"go zmienić. (np. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() zwraca podaną datę (ciąg lub obiekt) miesiąc pierwszy dzień
  4. GetDate("2019-08-08").get_month_last_day() zwraca podaną datę miesiąc ostatni dzień
  5. GetDate("2019-08-08").minimum_time() zwraca podaną datę rozpoczęcia dzień
  6. GetDate("2019-08-08").maximum_time() zwraca podaną datę koniec dnia
  7. GetDate("2019-08-08").time_delta_days({number_of_days})zwraca podaną datę + dodaj {liczba dni} (możesz także zadzwonić: GetDate(timezone.now()).time_delta_days(-1)na wczoraj)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) podobny do pkt 7, ale pracuje w godzinach
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) podobny do pkt 7, ale działa na sekundy
Michael Stachura
źródło
0

Od pewnego czasu musimy korzystać z wyszukiwania według daty i daty. Jeśli użyjemy date__range, musimy dodać 1 dzień z to_date, w przeciwnym razie zestaw zapytań będzie pusty.

Przykład:

od daty importu timedelta

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

to_date = parsować_datę (request.POST ['to_date']) + timedelta (dni = 1)

lista obecności = models.DailyAttendance.objects.filter (attdate__range = [od_daty, do_daty])

jahurul25
źródło