Python'da iki tarih arasındaki fark


138

İki farklı randevum var ve aralarındaki gün farkını bilmek istiyorum. Tarih biçimi YYYY-AA-GG şeklindedir.

Belirli bir numarayı bir tarihe EKLEME veya ÇIKARMA yapabilen bir işlevim var:

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

burada A tarih ve x eklemek istediğim gün sayısı. Ve sonuç başka bir tarih.

İki tarih verebileceğim bir işleve ihtiyacım var ve sonuç gün cinsinden tarih farkı olan bir int olacaktır.



AddonDays işlevinizin DST günlerinde başarısız olacağını unutmayın.
fishinear

Haklısın. İşlevi zaten değiştirdim. 3600 eklerseniz (bir saat) çalışacaktır.
mauguerra

Yanıtlar:


274

-İki datetimenesne arasındaki farkı elde etmek ve daysüyeyi almak için kullanı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
Mükemmel cevap. Açık olmak gerekirse, sonucu (d2 - d1)bir timedeltanesne olacaktır .
aganders3

Konsolda şu hatayı görüyorum: 'datetime.datetime' tür nesnesi 'strptime' özniteliğine sahip değil
mauguerra

2
TypeError alıyorum: Bir timedelta nesnesinde .days () yapmaya çalıştığımda 'int' nesnesi çağrılamıyor ve dokümantasyon da bundan bahsetmiyor ( docs.python.org/2/library/datetime.html ).
user1761806

4
Siz total_secondsde bahseder misiniz ? secondsBelgeleri okumadan denediğimde elde etmeyi beklediğim şey olduğu için önemli olduğunu düşünüyorum .
Martin Thoma

1
@ThejKiran d2 ve d1'in tam olarak bir gün ayrı olmasını sağlayın ve beklediğiniz şeyin bu olup olmadığını görün ;-)
Martin Thoma

27

Başka bir kısa çözüm:

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
Is not ifiçinde diff_datestamamen gereksiz fonksiyonu? Mutlak değerin tanımına göre, abs(date1-date2)her zaman eşit olacaktır abs(date2-date1).
Blckknght

En azından Python3.5 ile print ifadesi şöyle görünmelidir: print ('{} günler arasında {} ve {}'. Format (sonuç1, d1, d2))
Ernestas Kardzys

2

Yukarıda larsmans tarafından gönderilen kodu denedim, ancak birkaç sorun var:

1) Kod, olduğu gibi, mauguerra'da belirtildiği gibi hatayı atar 2) Kodu aşağıdaki şekilde değiştirirseniz:

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

Bu, datetime nesnelerinizi dizelere dönüştürür, ancak iki şey

1) Eksi işlecini dizelerde kullanamayacağınız için d2 - d1 başarısız olur ve 2) Yukarıda belirtilen cevabın ilk satırını okursanız, iki datetime nesnesinde - işlecini kullanmak istersiniz, ancak siz sadece onları dizelere dönüştürdü

Bulduğum şey, kelimenin tam anlamıyla yalnızca aşağıdakilere ihtiyacınız olduğuydu:

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.strptimeKodum dizeleri datetimenesnelere dönüştürmek için kullanır . OP "Tarihin formatı YYYY-AA-GG" olduğunu belirttiğinden, tarihlerin dizeler olarak temsil edildiğini varsaydım. Değilse, kesinlikle bir dönüşüme gerek yoktur.
Fred Foo

0

Bunu dene:

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'). şekil [0]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.