Thêm 5 ngày vào một ngày trong Python


366

Tôi có một ngày "10/10/11(m-d-y)"và tôi muốn thêm 5 ngày vào nó bằng tập lệnh Python. Vui lòng xem xét một giải pháp chung hoạt động vào cuối tháng cũng có.

Tôi đang sử dụng mã sau đây:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> đang in '2011-10-10 00:00:00'

Bây giờ tôi muốn thêm 5 ngày cho đến ngày này. Tôi đã sử dụng mã sau đây:

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

Mà trả về lỗi này:

name 'timedelta' is not defined

12
Manh mối chung: nếu bạn gặp lỗi name 'timedelta' is not defined, điều đó có nghĩa là bạn chưa xác định ở timedeltabất cứ đâu. Python thường khá nhiều thông tin về các thông báo lỗi của nó.
Katriel

1
Tìm kiếm không hoạt động? Tất cả các ví dụ mã này sẽ có ích: stackoverflow.com/search?q=python+timedelta . Dường như có hơn 200 câu hỏi giống như câu hỏi này.
S.Lott


9
Bạn muốn thêm năm ngày, nhưng sau đó bạn đã timedelta (ngày = 10) 'Tôi bối rối về việc 10 đến từ đâu và tại sao không phải là 5
FeifanZ

Câu trả lời:


556

Các câu trả lời trước là đúng nhưng nhìn chung nên thực hiện tốt hơn:

import datetime

Sau đó, bạn sẽ có, sử dụng datetime.timedelta:

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

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

7
datetime.datetime - tại sao hai lần?
paulmorriss

59
nhập như "từ datetime nhập datetime, timedelta" sẽ thêm khả năng đọc vào mã
Manel Clos

8
@paulmorriss: Bạn đang gọi strptimephương thức trên datetimelớp trong datetimemô-đun, vì vậy bạn cần chỉ định datetime.datetime.
Graeme Perrow

6
Tất cả chúng ta có thể đồng ý rằng việc đặt tên một lớp thường được sử dụng cùng tên với mô-đun chứa nó là một ý tưởng ngu ngốc? Là datetimegì Bạn không thể dựa vào quy ước để biết, nhưng luôn phải nhìn vào hàng nhập khẩu.
Xiong Chiamiov

8
Vấn đề di sản đuôi dài đó. nó "nên" from datetime import DateTimevì các lớp là CamelCase, nhưng datetime có trước PEP8.
Aaron McMillin

120

Nhập khẩu timedeltadateđầu tiên.

from datetime import timedelta, date

date.today()sẽ trả lại datetime ngày hôm nay, có thể là bạn muốn

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

11
datetime.date.today () thay vì Date.today ()
elsadek

2
@ dan-klasson Nó không hoạt động đối với tôi, dateđối tượng không có timedeltaphương pháp. Phiên bản Python nào bạn đang sử dụng?
DrTyrsa

@DrTyrsa Xấu quá. Nên là:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson 17/07/17

21

Nếu bạn đã sử dụng gấu trúc , bạn có thể tiết kiệm một ít không gian bằng cách không chỉ định định dạng:

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

Làm việc tốt cho tôi. Cảm ơn
renny

12

Tôi đoán bạn đang thiếu một cái gì đó như thế:

from datetime import timedelta

12

Đây là một phương pháp khác để thêm ngày vào ngày bằng cách sử dụng relativeelta của 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')

Đầu ra:

Hôm nay: 25/06/2015 15:56:09

Sau 5 ngày: 30/06/2015 15:56:09


10

Nếu bạn muốn thêm ngày để hẹn hò ngay bây giờ, bạn có thể sử dụng mã này

from datetime import datetime
from datetime import timedelta


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

9

Đây là chức năng nhận từ bây giờ + ngày được chỉ định

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)

Sử dụng:

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

1
Mã tốt. Nhưng IF của bạn để kiểm tra addDays trong get_date là không cần thiết
Eduardo

6

Để có mã dài dòng hơn và tránh xung đột tên giữa datetime và datetime.datetime , bạn nên đổi tên các lớp bằng tên CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Vì vậy, bạn có thể làm như sau, mà tôi nghĩ rằng nó là rõ ràng hơn.

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

Ngoài ra, sẽ không có xung đột tên nếu bạn muốn import datetimesau này.


0

sử dụng timedeltas bạn có thể làm:

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

Nói chung, bạn không có câu trả lời ngay bây giờ nhưng có lẽ lớp tôi tạo ra cũng sẽ rất hữu ích. Đối với tôi, nó giải quyết tất cả các yêu cầu của tôi mà tôi từng có trong các dự án Pyhon của mình.

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)

Làm thế nào để sử dụng nó

  1. self.tz = pytz.timezone("Europe/Warsaw") - ở đây bạn xác định Múi giờ bạn muốn sử dụng trong dự án
  2. GetDate("2019-08-08").current()- điều này sẽ chuyển đổi ngày chuỗi của bạn thành đối tượng nhận biết thời gian với múi giờ bạn đã xác định trong pt 1. Định dạng chuỗi mặc định là format="%Y-%m-%d"nhưng hãy thoải mái thay đổi nó. (ví dụ. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() trả về ngày đã cho (chuỗi hoặc đối tượng) vào ngày đầu tiên
  4. GetDate("2019-08-08").get_month_last_day() trả lại ngày tháng tháng trước
  5. GetDate("2019-08-08").minimum_time() trả lại ngày bắt đầu ngày
  6. GetDate("2019-08-08").maximum_time() trả lại ngày kết thúc
  7. GetDate("2019-08-08").time_delta_days({number_of_days})trả về ngày đã cho + thêm {số ngày} (bạn cũng có thể gọi: GetDate(timezone.now()).time_delta_days(-1)cho ngày hôm qua)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) tương tự pt 7 nhưng làm việc theo giờ
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) tương tự pt 7 nhưng hoạt động trên giây

0

Đôi khi chúng ta cần sử dụng tìm kiếm từ ngày & đến ngày. Nếu chúng ta sử dụng date__range thì chúng ta cần thêm 1 ngày với to_date nếu không bộ truy vấn sẽ trống.

Thí dụ:

từ datetime thời gian nhập dữ liệu

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

to_date = parse_date (request.POST ['to_date']) + timedelta (ngày = 1)

điểm tham dự = mô hình. DailyAttendance.objects.filter (attdate__range = [from_date, to_date])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.