2011-12-07 42 views
57

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.Sự khác biệt giữa hai ngày trong Python

Tôi có một chức năng mà có thể thêm hoặc bớt một số lượng nhất định đế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ào. Và kết quả là một ngày khác.

Tôi cần một chức năng mà tôi có thể đưa ra hai ngày và kết quả sẽ là một int có sự khác biệt về ngày trong ngày.

+1

bản sao có thể có của [Làm cách nào để tính số ngày betwen hai ngày bằng Python?] (Http://stackoverflow.com/questions/151199/how-do-i-calculate-number-of-days-betwen- hai ngày-sử dụng-python) –

+0

Lưu ý rằng hàm addonDays của bạn sẽ không thành công vào ngày DST. – fishinear

+0

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

Trả lời

134

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

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) 
+16

Câu trả lời hay. Để rõ ràng, kết quả của '(d2 - d1)' sẽ là một đối tượng ['timedelta'] (http://docs.python.org/library/datetime.html#datetime.timedelta). – aganders3

+0

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

+0

Tôi đã giải quyết được vấn đề ..... nó đã làm việc tốt hơn THAANKS !!! – mauguerra

2

tôi đã cố gắng mã đăng bởi larsmans trên nhưng, có một vài vấn đề:

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

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

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

1) Cố gắng làm d2 - d1 sẽ thất bại như bạn có thể không 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 ngày giờ nhưng bạn chỉ chuyển đổi chúng thành chuỗi

là bạn nghĩa là chỉ cần như sau:

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 các đối tượng' datetime'.Kể từ khi OP tuyên bố rằng "Định dạng của ngày là YYYY-MM-DD", tôi giả định ngày tháng được biểu diễn dưới dạng chuỗi. Nếu không, rõ ràng là không cần chuyển đổi. –

14

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

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() 
+2

Không phải là 'if' trong hàm' diff_dates' 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 bằng với 'abs (date2-date1)'. – Blckknght

+0

Đồng ý :) Bài đăng đã được cập nhật. Cảm ơn. – 0x8BADF00D

+0

Ít nhất với Python3.5 bản in sẽ giống như sau: in ('{} ngày giữa {} và {}'. Định dạng (kết quả1, d1, d2)) –

0

Hãy thử điều 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() 
Các vấn đề liên quan