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.