Sự khác biệt giữa hai ngày trong Python


137

Tôi có hai ngày khác nhau và tôi muốn biết sự khác biệt về ngày giữa chúng. Định dạng của ngày là YYYY-MM-DD.

Tôi có một chức năng có thể THÊM hoặc ĐĂNG KÝ một số đã cho đến một ngày:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

Trong đó A là ngày và x số ngày tôi muốn thêm. Và kết quả là một ngày khác.

Tôi cần một hàm trong đó tôi có thể đưa ra hai ngày và kết quả sẽ là một int với chênh lệch ngày tính theo ngày.



Lưu ý rằng chức năng addonDays của bạn sẽ thất bại vào những ngày DST.
fishinear

Bạn đúng rồi. Tôi đã sửa đổi chức năng. Nếu bạn thêm 3600 (một giờ) sẽ hoạt động.
mauguerra

Câu trả lời:


270

Sử dụng -để có được sự khác biệt giữa hai datetimeđối tượng và lấy daysthành viên.

from datetime import datetime

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

37
Câu trả lời chính xác. Để rõ ràng, kết quả của (d2 - d1)sẽ là một timedeltađối tượng.
aganders3

Tôi gặp lỗi này trên bảng điều khiển: loại đối tượng 'datetime.datetime' không có thuộc tính 'strptime'
mauguerra

2
Tôi get Lỗi Loại: 'int' đối tượng là không thể được gọi khi tôi cố gắng làm .days () trên một đối tượng timedelta và các tài liệu làm cho không đề cập đến nó trong hai ( docs.python.org/2/library/datetime.html ).
dùng1761806

4
Bạn có thể vui lòng đề cập total_seconds, quá? Tôi nghĩ nó quan trọng vì nó là thứ tôi mong đợi nhận được khi tôi thửseconds mà không đọc tài liệu.
Martin Thoma

1
@ThejKiran Làm cho d2 và d1 cách nhau đúng một ngày và xem đó có phải là điều bạn mong đợi không ;-)
Martin Thoma

27

Một giải pháp ngắn khác:

from datetime import date

def diff_dates(date1, date2):
    return abs(date2-date1).days

def main():
    d1 = date(2013,1,1)
    d2 = date(2013,9,13)
    result1 = diff_dates(d2, d1)
    print '{} days between {} and {}'.format(result1, d1, d2)
    print ("Happy programmer's day!")

main()

3
Không phải iftrong diff_dateschức năng hoàn toàn không cần thiết? Theo định nghĩa của giá trị tuyệt đối, abs(date1-date2)sẽ luôn luôn bằng abs(date2-date1).
Blckknght

Ít nhất với Python3.5, câu lệnh in sẽ giống như thế này: print ('{} ngày giữa định dạng {} và {}'. (Result1, d1, d2))
Ernestas Kardzys

2

Tôi đã thử mã được đăng bởi larsmans ở trên, nhưng, có một vài vấn đề:

1) Mã như sẽ ném lỗi như được đề cập bởi mauguerra 2) Nếu bạn thay đổi mã thành như sau:

...
    d1 = d1.strftime("%Y-%m-%d")
    d2 = d2.strftime("%Y-%m-%d")
    return abs((d2 - d1).days)

Điều này sẽ chuyển đổi các đối tượng datetime của bạn thành chuỗi, nhưng, hai điều

1) Cố gắng thực hiện d2 - d1 sẽ thất bại vì bạn không thể sử dụng toán tử trừ trên chuỗi và 2) Nếu bạn đọc dòng đầu tiên của câu trả lời ở trên, bạn muốn sử dụng toán tử - trên hai đối tượng datetime nhưng, bạn chỉ chuyển đổi chúng thành chuỗi

Những gì tôi tìm thấy là bạn thực sự chỉ cần những điều sau đây:

import datetime

end_date = datetime.datetime.utcnow()
start_date = end_date - datetime.timedelta(days=8)
difference_in_days = abs((end_date - start_date).days)

print difference_in_days

1
Mã của tôi sử dụng datetime.strptimeđể chuyển đổi chuỗi thành datetimecác đối tượng. Vì OP tuyên bố rằng "Định dạng của ngày là YYYY-MM-DD", tôi giả sử ngày được biểu diễn dưới dạng chuỗi. Nếu họ không, rõ ràng là không cần chuyển đổi.
Fred Foo

0

Thử cái này:

data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv')
data.head(5)
first=data['1st Gift']
last=data['Last Gift']
maxi=data['Largest Gift']
l_1=np.mean(first)-3*np.std(first)
u_1=np.mean(first)+3*np.std(first)


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
pd.value_counts(m)
l=first[m]
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
data['1st Gift'].head()




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
pd.value_counts(m)
l=last[m]
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
data['Last Gift'].head()

-4

pd.date_range ('2019-01-01', '2019-02-01'). hình dạng [0]

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.