2011-08-10 25 views
28

Olası Çoğalt:
Best way to find the months between two dates (in python)Python: ayda 2 tarihsaat farkı

isterim

ben bu farklılığın ay sayısını tam olarak nasıl sahip olabileceğini bilmek:

date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') 
date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') 

date2-date1 sonuçları

datetime.timedelta(183, 43200) 

Ben değil 6 (çünkü saat) dönmelidir bu durumda ay tam sayısını, bilmek istiyorum

+0

: http://stackoverflow.com/questions/4039879 Bence

, amaçla zamanın atomik birimleri olarak ayda düşünün ve bu formülü kullanmak daha sezgisel/en-iki-tarih-içinde-ay-ay-iki-tarihleri-içinde-python – Dan

+0

saat ile datetime için değil –

+1

Bu sadece ne "tam ay sayısı" anlamına gelir karar verdikten sonra cevap daha kolay olacaktır. Bir ay sabit uzunlukta bir süre değildir; 28 ila 31 gün arasında değişebilir. 1 Ocak ve 1 Şubat, 1 Şubat ve 1 Mart'tan daha uzakta; "tam olarak 1 ay" aralıklarını mı diyorsunuz? –

cevap

22

, sadece aylar güvenebilirsiniz.

from calendar import monthrange 
from datetime import datetime, timedelta 

def monthdelta(d1, d2): 
    delta = 0 
    while True: 
     mdays = monthrange(d1.year, d1.month)[1] 
     d1 += timedelta(days=mdays) 
     if d1 <= d2: 
      delta += 1 
     else: 
      break 
    return delta 
5

bu şekilde birkaç olmasıdır bunu yapmanın avantajı modül bağımlılıkları ve döngü yok - aylar düz hesaplama ile bulunabilir.

import datetime as dt 

def months_between(date1,date2): 
    if date1>date2: 
     date1,date2=date2,date1 
    m1=date1.year*12+date1.month 
    m2=date2.year*12+date2.month 
    months=m2-m1 
    if date1.day>date2.day: 
     months-=1 
    elif date1.day==date2.day: 
     seconds1=date1.hour*3600+date1.minute+date1.second 
     seconds2=date2.hour*3600+date2.minute+date2.second 
     if seconds1>seconds2: 
      months-=1 
    return months 

date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') 
date2 = dt.datetime.strptime('2012-02-15', '%Y-%m-%d') 
print(months_between(date1,date2)) 
# 5 

date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S') 
date2 = dt.datetime.strptime('2012-02-15 11:59:00', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 5 

date2 = dt.datetime.strptime('2012-02-15 12:00:00', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 6 

date2 = dt.datetime.strptime('2012-02-15 12:00:01', '%Y-%m-%d %X') 
print(months_between(date1,date2)) 
# 6 
52

Sen python-dateutil kullanabilirsiniz. Her ay kaç gün öğrenmek için calendar modülünü kullanarak

In [4]: from datetime import datetime 

In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S') 

In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d') 

In [7]: from dateutil import relativedelta 

In [8]: r = relativedelta.relativedelta(date1, date2) 

In [9]: r 
Out[9]: relativedelta(months=-5, days=-30, hours=-12) 
+5

olsa: “relativedelta.relativedelta (tarih (2015, 9, 30), tarih (2015, 10, 1)). Month' 0'dır, ancak aylar olduğunu bilmek istiyorsanız beklenen sonucu yansıtmayabilir. Farklı – ezdazuzena

13

yalnızca siz yerine getirmesi gereken şartlar biliyorum ama bu iki tarih arasında 183 gün ve 43200 SI saniye olduğu gerçeği "gerçekten" kaç ay olduğunu belirlemede doğasında öznelliği vurgulamaktadır.

Bir ay 30 gün veya (365/12) gün veya ((365 * 4 + 1)/48) gün veya ...?

Bir gün her zaman 86400 saniye midir, yoksa geçmiş saniye sürüyor mu, yoksa ileriki tarihler için bir saniye geçiyor mu?

Bu kararlar, arzu ettiğiniz algoritmanın, bu sınırlara yakın belirli giriş tarihleri ​​için vereceğiniz yanıtı etkilemesini etkiler. Bu soru zaten burada cevaplandı (date2.year - date1.year) * 12 + (date2.month - date1.month)

+0

Bu verimli ve iyi açıklanmış, benim sorunum için çalıştı. –