การเพิ่ม 5 วันใน Python


366

ฉันมีวันที่"10/10/11(m-d-y)"และฉันต้องการเพิ่ม 5 วันโดยใช้สคริปต์ Python โปรดพิจารณาโซลูชันทั่วไปที่ใช้งานได้ในเดือนนี้เช่นกัน

ฉันกำลังใช้รหัสต่อไปนี้:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> กำลังพิมพ์ '2011-10-10 00:00:00'

ตอนนี้ฉันต้องการเพิ่ม 5 วันในวันนี้ ฉันใช้รหัสต่อไปนี้:

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

ซึ่งส่งกลับข้อผิดพลาดนี้:

name 'timedelta' is not defined

12
เบาะแสทั่วไป: หากคุณได้รับข้อผิดพลาดname 'timedelta' is not definedนั่นหมายความว่าคุณไม่ได้กำหนดไว้timedeltaที่ใด งูใหญ่มักให้ข้อมูลเกี่ยวกับข้อความแสดงข้อผิดพลาด
Katriel

1
การค้นหาไม่ทำงานใช่ไหม ทั้งหมดตัวอย่างโค้ดเหล่านี้จะได้ช่วย: stackoverflow.com/search?q=python+timedelta ดูเหมือนจะมีคำถามมากกว่า 200 ข้อเหมือนกับคำถามนี้
S.Lott


9
คุณต้องการที่จะเพิ่มห้าวัน แต่แล้วคุณมี timedelta (วัน = 10) ... ฉันสับสนเกี่ยวกับที่มาจาก 10 และทำไมมันไม่ 5
FeifanZ

คำตอบ:


556

คำตอบก่อนหน้านี้ถูกต้อง แต่โดยทั่วไปควรปฏิบัติดังนี้:

import datetime

จากนั้นคุณจะมีโดยใช้datetime.timedelta:

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

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

7
datetime.datetime - ทำไมสองครั้ง
paulmorriss

59
การนำเข้าเช่น "จากวันที่และเวลานำเข้า datetime, timedelta" จะเพิ่มการอ่านรหัส
Manel Clos

8
@paulmorriss: คุณกำลังเรียกstrptimeวิธีการในdatetimeชั้นเรียนในโมดูลดังนั้นคุณจะต้องระบุdatetime datetime.datetime
แกรมเพอร์โรว์

6
เราทุกคนสามารถตกลงกันได้หรือไม่ว่าการตั้งชื่อคลาสที่ใช้กันทั่วไปมีชื่อเดียวกันกับโมดูลที่บรรจุมันเป็นแนวคิดที่โง่ คือdatetimeอะไร คุณไม่สามารถพึ่งพาการประชุมที่จะรู้ แต่ต้องดูการนำเข้าเสมอ
Xiong Chiamiov

8
ปัญหาขนหางยาวอยู่ที่นั่น มัน "ควร" from datetime import DateTimeเนื่องจากคลาส CamelCased แต่ datetime นำหน้า PEP8
Aaron McMillin

120

นำเข้าtimedeltaและdateก่อน

from datetime import timedelta, date

และdate.today()จะคืนวันที่และเวลาของวันนี้เป็นไปตามที่คุณต้องการ

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

11
datetime.date.today () แทน Date.today ()
elsadek

2
@ dan-klasson มันใช้งานไม่ได้สำหรับฉันแล้วdateobject ไม่มีtimedeltaวิธี คุณใช้ Python เวอร์ชันใดอยู่?
DrTyrsa

@DrTyrsa ฉันไม่ดี ควรเป็น:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

หากคุณกำลังใช้แพนด้าอยู่แล้วคุณสามารถประหยัดพื้นที่ได้เพียงเล็กน้อยโดยไม่ระบุรูปแบบ:

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

ทำงานได้ดีสำหรับฉัน ขอบคุณ
renny


12

นี่คือวิธีการอื่นเพื่อเพิ่มวันในวันที่ใช้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')

เอาท์พุท:

วันนี้: 25/06/2015 15:56:09 น

หลังจาก 5 วัน: 30/06/2015 15:56:09 น


10

หากคุณต้องการเพิ่มวันเป็นปัจจุบันคุณสามารถใช้รหัสนี้

from datetime import datetime
from datetime import timedelta


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

9

นี่คือฟังก์ชั่นในการรับวันนี้ + วันที่ระบุ

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)

การใช้งาน:

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

1
รหัสที่ดี แต่ถ้าคุณเพื่อทดสอบ addDays ใน get_date ที่ไม่จำเป็น
เอดูอาร์

6

เพื่อให้มีรหัส verbose น้อยลงและหลีกเลี่ยงความขัดแย้งของชื่อ ระหว่าง datetime และ datetime.datetimeคุณควรเปลี่ยนชื่อคลาสด้วยชื่อCamelCase

from datetime import datetime as DateTime, timedelta as TimeDelta

ดังนั้นคุณสามารถทำสิ่งต่อไปนี้ซึ่งฉันคิดว่าชัดเจนขึ้น

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

นอกจากนี้จะไม่มีข้อขัดแย้งของชื่อหากคุณต้องการในimport datetimeภายหลัง


0

ใช้timedeltas คุณสามารถทำได้:

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

โดยทั่วไปคุณมีคำตอบแล้ว แต่ชั้นเรียนของฉันที่ฉันสร้างขึ้นอาจเป็นประโยชน์เช่นกัน สำหรับฉันแล้วมันแก้ความต้องการทั้งหมดของฉันที่ฉันเคยมีในโครงการ 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)

วิธีใช้งาน

  1. self.tz = pytz.timezone("Europe/Warsaw") - ที่นี่คุณกำหนดเขตเวลาที่คุณต้องการใช้ในโครงการ
  2. GetDate("2019-08-08").current()- สิ่งนี้จะแปลงวันที่ในสตริงของคุณเป็นวัตถุที่รับรู้เวลาด้วยเขตเวลาที่คุณกำหนดใน pt 1 รูปแบบสตริงเริ่มต้นคือformat="%Y-%m-%d"แต่คุณสามารถเปลี่ยนได้ (เช่น. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() ส่งกลับวันที่ที่กำหนด (สตริงหรือวัตถุ) เดือนวันแรก
  4. GetDate("2019-08-08").get_month_last_day() ส่งคืนวันที่ที่กำหนดเดือนวันสุดท้าย
  5. GetDate("2019-08-08").minimum_time() ส่งคืนวันที่ที่กำหนดเริ่มต้นวันที่
  6. GetDate("2019-08-08").maximum_time() ส่งคืนวันที่สิ้นสุดที่กำหนด
  7. GetDate("2019-08-08").time_delta_days({number_of_days})ส่งคืนวันที่ที่กำหนด + เพิ่ม {จำนวนวัน} (คุณสามารถโทรหา: GetDate(timezone.now()).time_delta_days(-1)เมื่อวานนี้)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) คล้ายกับ pt 7 แต่ทำงานในชั่วโมง
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) คล้ายกับ pt 7 แต่ทำงานในไม่กี่วินาที

0

บางครั้งเราจำเป็นต้องใช้การค้นหาจากวันที่ & วันที่ ถ้าเราใช้ date__range เราต้องเพิ่ม 1 วันด้วย to_date มิฉะนั้นชุดแบบสอบถามจะว่างเปล่า

ตัวอย่าง:

จาก timedelta นำเข้าวันที่และเวลา

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

to_date = parse_date (request.POST ['to_date']) + timedelta (วัน = 1)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.