Menambahkan 5 hari ke tanggal dalam Python


366

Saya punya tanggal "10/10/11(m-d-y)"dan saya ingin menambahkan 5 hari untuk itu menggunakan skrip Python. Silakan pertimbangkan solusi umum yang bekerja pada bulan yang berakhir juga.

Saya menggunakan kode berikut:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> sedang mencetak '2011-10-10 00:00:00'

Sekarang saya ingin menambahkan 5 hari ke tanggal ini. Saya menggunakan kode berikut:

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

Yang mengembalikan kesalahan ini:

name 'timedelta' is not defined

12
Petunjuk umum: jika Anda mendapatkan kesalahan name 'timedelta' is not defined, itu berarti Anda belum menentukan di timedeltamana pun. Python biasanya cukup informatif tentang pesan kesalahannya.
Katriel

1
Pencarian tidak berhasil? Semua contoh kode ini akan membantu: stackoverflow.com/search?q=python+timedelta . Tampaknya ada lebih dari 200 pertanyaan seperti ini.
S.Lott


9
Anda ingin menambahkan lima hari, tetapi kemudian Anda memiliki timedelta (hari = 10) ... Saya bingung tentang dari mana asal 10 dan mengapa itu bukan 5
FeifanZ

Jawaban:


556

Jawaban sebelumnya benar tetapi umumnya lebih baik dilakukan:

import datetime

Maka Anda harus, menggunakan datetime.timedelta:

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

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

7
datetime.datetime - mengapa dua kali?
paulmorriss

59
mengimpor seperti "dari datetime import datetime, timedelta" akan menambah kesesuaian dengan kode
Manel Clos

8
@ paulmorriss: Anda memanggil strptimemetode pada datetimekelas dalam datetimemodul, jadi Anda perlu menentukan datetime.datetime.
Graeme Perrow

6
Bisakah kita semua sepakat bahwa penamaan kelas yang biasa digunakan dengan nama yang sama dengan modul yang berisi itu adalah ide yang bodoh? Apa datetime? Anda tidak bisa mengandalkan konvensi untuk mengetahuinya, tetapi selalu harus melihat impor.
Xiong Chiamiov

8
Masalah warisan ekor panjang di sana. itu "harus" from datetime import DateTimekarena kelas CamelCased, tetapi datetime mendahului PEP8.
Aaron McMillin

120

Impor timedeltadan datepertama.

from datetime import timedelta, date

Dan date.today()akan mengembalikan datetime hari ini, mungkin Anda inginkan

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

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

2
@ dan-klasson Tidak berhasil bagi saya, dateobjek tidak memiliki timedeltametode. Apa versi Python yang Anda gunakan?
DrTyrsa

@DrTyrsa saya buruk. Seharusnya:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

Jika Anda sudah menggunakan panda , Anda dapat menghemat sedikit ruang dengan tidak menentukan format:

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

Bekerja dengan baik untuk saya. Terima kasih
renny

12

Saya kira Anda kehilangan sesuatu seperti itu:

from datetime import timedelta

12

Berikut adalah metode lain untuk menambahkan hari pada tanggal menggunakan 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')

Keluaran:

Hari ini: 25/06/2015 15:56:09

Setelah 5 Hari: 30/06/2015 15:56:09


10

Jika Anda ingin menambahkan hari ke tanggal sekarang, Anda dapat menggunakan kode ini

from datetime import datetime
from datetime import timedelta


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

9

Ini adalah fungsi untuk mendapatkan dari sekarang + hari yang ditentukan

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)

Pemakaian:

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

1
Kode yang baik Tetapi IF Anda untuk menguji addDays di get_date tidak diperlukan
Eduardo

6

Untuk memiliki kode yang kurang verbose , dan menghindari konflik nama antara datetime dan datetime.datetime , Anda harus mengganti nama kelas dengan nama CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Jadi Anda bisa melakukan yang berikut, yang menurut saya lebih jelas.

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

Juga, tidak akan ada konflik nama jika Anda ingin import datetimenanti.


0

menggunakan timedeltas yang dapat Anda lakukan:

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

Secara umum Anda belum mendapat jawaban sekarang, tetapi mungkin kelas yang saya buat juga akan membantu. Bagi saya itu menyelesaikan semua kebutuhan saya yang pernah saya miliki dalam proyek Pyhon saya.

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)

Bagaimana cara menggunakannya

  1. self.tz = pytz.timezone("Europe/Warsaw") - di sini Anda menentukan Zona Waktu yang ingin Anda gunakan dalam proyek
  2. GetDate("2019-08-08").current()- ini akan mengonversi tanggal string Anda menjadi objek yang sadar waktu dengan zona waktu yang Anda tetapkan dalam pt 1. Format string default adalah format="%Y-%m-%d"tetapi jangan ragu untuk mengubahnya. (mis. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() mengembalikan tanggal yang diberikan (string atau objek) bulan hari pertama
  4. GetDate("2019-08-08").get_month_last_day() mengembalikan tanggal yang diberikan bulan hari terakhir
  5. GetDate("2019-08-08").minimum_time() mengembalikan tanggal yang diberikan mulai hari
  6. GetDate("2019-08-08").maximum_time() mengembalikan tanggal akhir hari yang diberikan
  7. GetDate("2019-08-08").time_delta_days({number_of_days})mengembalikan tanggal yang diberikan + tambahkan {jumlah hari} (Anda juga dapat menghubungi: GetDate(timezone.now()).time_delta_days(-1)untuk kemarin)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) mirip dengan 7 tetapi bekerja pada jam
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) mirip dengan pt 7 tetapi bekerja pada detik

0

Beberapa waktu kita perlu menggunakan pencarian dari tanggal & tanggal. Jika kita menggunakan date__range maka kita perlu menambahkan 1 hari dengan to_date jika tidak, queryset akan kosong.

Contoh:

dari datetime impor timedelta

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

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.