ความแตกต่างระหว่างวันที่สองวันใน Python


138

ฉันมีวันที่สองวันที่แตกต่างกันและฉันต้องการทราบความแตกต่างระหว่างวัน รูปแบบของวันที่คือ YYYY-MM-DD

ฉันมีฟังก์ชั่นที่สามารถเพิ่มหรือ SUBTRACT หมายเลขที่กำหนดเป็นวันที่:

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

โดยที่ A คือวันที่และ x จำนวนวันที่ฉันต้องการเพิ่ม และผลลัพธ์ก็คือวันที่อื่น

ฉันต้องการฟังก์ชันที่ฉันสามารถระบุวันที่ได้สองวันและผลลัพธ์จะเป็น int ที่มีความแตกต่างของวันที่เป็นวัน



โปรดทราบว่าฟังก์ชัน addonDays ของคุณจะล้มเหลวในวัน DST
fishinear

คุณพูดถูก ฉันแก้ไขฟังก์ชันแล้ว หากคุณเพิ่ม 3600 (หนึ่งชั่วโมง) จะใช้งานได้
mauguerra

คำตอบ:


274

ใช้-เพื่อรับความแตกต่างระหว่างสองdatetimeวัตถุและรับ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)

37
คำตอบที่ดี เพื่อความชัดเจนผลลัพธ์ของ(d2 - d1)จะเป็นtimedeltaวัตถุ
aganders3

ฉันมีข้อผิดพลาดนี้บนคอนโซล: พิมพ์ object 'datetime.datetime' ไม่มีแอตทริบิวต์ 'strptime'
mauguerra

2
ฉันได้รับ TypeError: วัตถุ 'int' ไม่สามารถเรียกใช้ได้เมื่อฉันพยายามทำ .days () บนวัตถุที่กำหนดเวลาและเอกสารประกอบไม่ได้กล่าวถึงมันอย่างใดอย่างหนึ่ง ( docs.python.org/2/library/datetime.html )
user1761806

4
ช่วยพูดถึงtotal_secondsด้วยได้ไหม? ฉันคิดว่ามันสำคัญเพราะเป็นสิ่งที่ฉันคาดหวังว่าจะได้รับเมื่อฉันพยายามsecondsโดยไม่ต้องอ่านเอกสาร
Martin Thoma

1
@ThejKiran ทำให้ d2 และ d1 อยู่ห่างกันในวันเดียวและดูว่าเป็นอย่างที่คุณคาดหวังหรือไม่ ;-)
Martin Thoma

27

อีกวิธีแก้ปัญหาสั้น ๆ :

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
ไม่ได้เป็นifในdiff_datesฟังก์ชั่นที่ไม่จำเป็นสมบูรณ์? ตามคำนิยามของค่าสัมบูรณ์ที่มักจะเท่ากับabs(date1-date2) abs(date2-date1)
Blckknght

อย่างน้อยด้วย Python3.5 คำสั่งพิมพ์ควรมีลักษณะดังนี้พิมพ์ (รูปแบบ '{} วันระหว่าง {} ถึง {}' (result1, d1, d2))
Ernestas Kardzys

2

ฉันลองใช้รหัสที่โพสต์โดย larsmans ด้านบน แต่มีปัญหาสองสามประการ:

1) รหัสตามที่เป็นอยู่จะทำให้เกิดข้อผิดพลาดตามที่กล่าวไว้โดย mauguerra 2) หากคุณเปลี่ยนรหัสเป็นดังต่อไปนี้:

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

สิ่งนี้จะแปลงวัตถุวันที่และเวลาของคุณเป็นสตริง แต่มีสองอย่าง

1) การพยายามทำ d2 - d1 จะล้มเหลวเนื่องจากคุณไม่สามารถใช้ตัวดำเนินการลบกับสตริงและ 2) หากคุณอ่านบรรทัดแรกของคำตอบข้างต้นที่ระบุไว้คุณต้องการใช้ตัวดำเนินการ - กับวัตถุสองวันและเวลา แต่คุณเพียงแค่ แปลงเป็นสตริง

สิ่งที่ฉันพบคือคุณต้องการเพียงสิ่งต่อไปนี้เท่านั้น:

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
รหัสของฉันใช้datetime.strptimeในการแปลงสตริงเป็นdatetimeวัตถุ เนื่องจาก OP ระบุว่า "รูปแบบของวันที่คือ YYYY-MM-DD" ฉันจึงถือว่าวันที่แสดงเป็นสตริง หากไม่เป็นเช่นนั้นก็ไม่จำเป็นต้องมีการแปลง
Fred Foo

0

ลองสิ่งนี้:

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

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