Python'da bir tarihe 5 gün ekleme


366

Bir tarih var "10/10/11(m-d-y)"ve bir Python komut dosyası kullanarak 5 gün eklemek istiyorum. Lütfen ay sonunda da çalışan genel bir çözüm düşünün.

Aşağıdaki kodu kullanıyorum:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> yazdırıyor '2011-10-10 00:00:00'

Şimdi bu tarihe 5 gün eklemek istiyorum. Aşağıdaki kodu kullandım:

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

Bu hatayı döndürdü:

name 'timedelta' is not defined

12
Genel ipucu: hatayı alırsanız name 'timedelta' is not defined, bu timedeltahiçbir yerde tanımlamadığınız anlamına gelir . Python genellikle hata mesajları hakkında oldukça bilgilendiricidir.
Katriel

1
Arama işe yaramadı mı? Bu kod örneklerinin tümü yardımcı olabilir: stackoverflow.com/search?q=python+timedelta . Bunun gibi 200'den fazla soru var gibi görünüyor.
S.Lott


9
Beş gün eklemek istiyorsunuz, ama sonra timedelta (gün = 10) var ... 10'un nereden geldiği ve neden 5 olmadığı konusunda kafam karıştı
FeifanZ

Yanıtlar:


556

Önceki cevaplar doğrudur, ancak genellikle daha iyi bir uygulamadır:

import datetime

Sonra şunları kullanırsınız datetime.timedelta:

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

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

7
datetime.datetime - neden iki kez?
paulmorriss

59
"datetime import datetime, timedelta" gibi içe aktarma, koda okunabilirlik ekler
Manel Clos

8
@paulmorriss: Modüldeki sınıfta strptimeyöntemi çağırıyorsunuz , bu yüzden belirtmeniz gerekiyor . datetimedatetimedatetime.datetime
Graeme Perrow

6
Hepimiz, yaygın olarak kullanılan bir sınıfı, onu içeren modülle aynı adla adlandırmanın aptalca bir fikir olduğunu kabul edebilir miyiz? Nedir datetime? Bilmek için konvansiyona güvenemezsiniz, ancak her zaman ithalata bakmak zorundasınız.
Xiong Chiamiov

8
Orada uzun kuyruk mirası sorunu. from datetime import DateTimesınıflar CamelCased olduğundan "olmalıdır" , ancak datetime PEP8'den önce gelir.
Aaron McMillin

120

İçe aktarma timedeltave dateönce.

from datetime import timedelta, date

Ve date.today()bugünün datetime dönecek, istersen

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

11
Date.today () yerine datetime.date.today ()
elsadek

2
@ dan-klasson Benim için çalışmıyor, datenesnenin timedeltayöntemi yok. Hangi Python sürümünü kullanıyorsunuz?
DrTyrsa

@DrTyrsa Kötü. Olması gereken:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

Zaten panda kullanıyorsanız , biçimi belirtmeden biraz yer kazanabilirsiniz:

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

Benim için iyi çalıştı. Teşekkürler
renny

12

Sanırım böyle bir şey eksik:

from datetime import timedelta

12

Burada dateutil's relativedelta kullanarak gün eklemek için başka bir yöntem .

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

Çıktı:

Bugün: 25/06/2015 15:56:09

5 Gün Sonrası: 30/06/2015 15:56:09


10

Şimdiye kadar gün eklemek istiyorsanız, bu kodu kullanabilirsiniz

from datetime import datetime
from datetime import timedelta


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

9

Şu andan itibaren + belirtilen günlerden alma işlevi

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)

Kullanımı:

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

1
İyi kod. Ancak get_date içindeki addDay'leri test etmek için IF'niz gerekli değildir
Eduardo

6

Daha az ayrıntılı bir kodunuz olması ve datetime ile datetime.datetime arasındaki ad çakışmalarından kaçınmak için sınıfları CamelCase adlarıyla yeniden adlandırmalısınız .

from datetime import datetime as DateTime, timedelta as TimeDelta

Böylece aşağıdakileri yapabilirsiniz, ki bu daha net olduğunu düşünüyorum.

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

Ayrıca, daha sonra isterseniz ad çakışması olmaz import datetime.


0

timedeltas kullanarak şunları yapabilirsiniz:

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

Genelde şimdi bir cevabı unuttun ama belki benim oluşturduğum sınıfım da faydalı olacaktır. Benim için Pyhon projelerimde sahip olduğum tüm gereksinimleri karşılıyor.

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)

Bu nasıl kullanılır

  1. self.tz = pytz.timezone("Europe/Warsaw") - burada projede kullanmak istediğiniz Saat Dilimini tanımlarsınız
  2. GetDate("2019-08-08").current()- Bu, pt 1'de tanımladığınız saat dilimi ile dize tarihinizi zamana duyarlı nesneye dönüştürecektir. Varsayılan dize biçimi, format="%Y-%m-%d"ancak değiştirmekten çekinmeyin. (Örneğin.GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current() )
  3. GetDate("2019-08-08").get_month_first_day() verilen tarihi (dize veya nesne) ay ilk gün döndürür
  4. GetDate("2019-08-08").get_month_last_day() geçen gün ay verilen gün
  5. GetDate("2019-08-08").minimum_time() belirtilen gün başlangıç ​​tarihi
  6. GetDate("2019-08-08").maximum_time() verilen tarih gün sonu
  7. GetDate("2019-08-08").time_delta_days({number_of_days})verilen tarihle döner + {gün sayısı} ekle ( GetDate(timezone.now()).time_delta_days(-1)dün için de arayabilirsiniz :)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) pt 7'ye benzer ancak saatlerce çalışıyor
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) pt 7'ye benzer ancak saniyeler içinde çalışıyor

0

Bir süre, tarih ve tarihe göre aramayı kullanmamız gerekir. Date__range kullanırsak, to_date ile 1 gün eklememiz gerekir, aksi takdirde queryset boşalır.

Misal:

datetime import timedelta'dan

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

to_date = parse_date (request.POST ['to_date']) + zaman aralığı (gün = 1)

attendance_list = modeller.DailyAttendance.objects.filter (attdate__range = [from_date, to_date])

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.