Verilen iki tarih arasındaki gün sayısı nasıl hesaplanır?


506

İki tarihim varsa (ör. '8/18/2008'Ve '9/26/2008'), bu iki tarih arasındaki gün sayısını almanın en iyi yolu nedir?

Yanıtlar:


800

İki tarih nesneniz varsa, bir timedeltanesneyi hesaplayan bunları çıkarabilirsiniz .

from datetime import date

d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)

Dokümanların ilgili bölümü: https://docs.python.org/library/datetime.html .

Başka bir örnek için bu cevaba bakınız .


2
Burada harika cevaplar. Birçok kişi panda veri çerçevesini kullanıyor olabileceğinden np.datetime64, python datetime stackoverflow.com/questions/52982056/…
Pramit

Güzel olan, bu çözümün artık yıllar boyunca doğru deltayı döndürmesi.
Lasma

154

Tarih saatinin gücünü kullanma:

from datetime import datetime
date_format = "%m/%d/%Y"
a = datetime.strptime('8/18/2008', date_format)
b = datetime.strptime('9/26/2008', date_format)
delta = b - a
print delta.days # that's it

4
aslında, tarih sınıfı bu durumda tarih saatinden daha uygun olacaktır.
Jeremy Cantrell

10
@JeremyCantrell Yine de, sekiz yıl sonra bile datehala kendi eşdeğeri eksik strptime().
JAB

Neden ihtiyacı arg? Biçimi olan ilk arg tarihiyle açık olmalıdır. strptimeformat
Timo

36

Noel'e Kadar Geçen Gün Sayısı:

>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86

Daha aritmetik burada .


16

Datetime modülünü istiyorsunuz.

>>> from datetime import datetime, timedelta 
>>> datetime(2008,08,18) - datetime(2008,09,26) 
datetime.timedelta(4) 

Başka bir örnek:

>>> import datetime 
>>> today = datetime.date.today() 
>>> print(today)
2008-09-01 
>>> last_year = datetime.date(2007, 9, 1) 
>>> print(today - last_year)
366 days, 0:00:00 

Belirttiği gibi burada


1
Bunu 0:00:00 bölümü olmadan nasıl edinebilirim?
Vicki B

@VickiBdelta = today - last_year print(delta.days)
dbakiu

8
from datetime import datetime
start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")
print abs((end_date-start_date).days)

2
Bu, 4 yıl önce verilen cevaplara kıyasla yeni bir şey eklemiyor. -1.
Mark Amery

Kullanım için +1 abs(), karşılaştırılan tarihler önceden bilinmediğinde yararlıdır ve ilgilendiğiniz farktır. İkinci tarihiniz datetime.strptime(date, date)ilk tarihten sonra ise, sonuç negatif olacaktır. abs()tüm girdileri mutlak yapar (yani pozitif).
veuncent


6

Lib kullanmadan sadece saf kod:

#Calculate the Days between Two Date

daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def isLeapYear(year):

    # Pseudo code for this algorithm is found at
    # http://en.wikipedia.org/wiki/Leap_year#Algorithm
    ## if (year is not divisible by 4) then (it is a common Year)
    #else if (year is not divisable by 100) then (ut us a leap year)
    #else if (year is not disible by 400) then (it is a common year)
    #else(it is aleap year)
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

def Count_Days(year1, month1, day1):
    if month1 ==2:
        if isLeapYear(year1):
            if day1 < daysOfMonths[month1-1]+1:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
        else: 
            if day1 < daysOfMonths[month1-1]:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
    else:
        if day1 < daysOfMonths[month1-1]:
             return year1, month1, day1+1
        else:
            if month1 ==12:
                return year1+1,1,1
            else:
                    return year1, month1 +1 , 1


def daysBetweenDates(y1, m1, d1, y2, m2, d2,end_day):

    if y1 > y2:
        m1,m2 = m2,m1
        y1,y2 = y2,y1
        d1,d2 = d2,d1
    days=0
    while(not(m1==m2 and y1==y2 and d1==d2)):
        y1,m1,d1 = Count_Days(y1,m1,d1)
        days+=1
    if end_day:
        days+=1
    return days


# Test Case

def test():
    test_cases = [((2012,1,1,2012,2,28,False), 58), 
                  ((2012,1,1,2012,3,1,False), 60),
                  ((2011,6,30,2012,6,30,False), 366),
                  ((2011,1,1,2012,8,8,False), 585 ),
                  ((1994,5,15,2019,8,31,False), 9239),
                  ((1999,3,24,2018,2,4,False), 6892),
                  ((1999,6,24,2018,8,4,False),6981),
                  ((1995,5,24,2018,12,15,False),8606),
                  ((1994,8,24,2019,12,15,True),9245),
                  ((2019,12,15,1994,8,24,True),9245),
                  ((2019,5,15,1994,10,24,True),8970),
                  ((1994,11,24,2019,8,15,True),9031)]

    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"

test()

3

herkes tarihi kullanarak mükemmel cevap verdi, pandaları kullanarak cevaplamaya çalışayım

dt = pd.to_datetime('2008/08/18', format='%Y/%m/%d')
dt1 = pd.to_datetime('2008/09/26', format='%Y/%m/%d')

(dt1-dt).days

Bu cevap verecektir. Girişlerden birinin veri çerçevesi sütunu olması durumunda. sadece gün yerine dt.days kullanın

(dt1-dt).dt.days

2

Henüz datetime.toordinal()belirtilmeyen bir yöntem de vardır :

import datetime
print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal())  # 39

https://docs.python.org/3/library/datetime.html#datetime.date.toordinal

date.toordinal ()

Yılın 1 Ocak 1 herhangi biri için sıra 1. sahiptir tarihe ait ilerisini düşünerek Gregoryen ordinal İade datenesne d , date.fromordinal(d.toordinal()) == d.

O kadar okunabilir olmasa da, gün farkını hesaplamak için çok uygun görünüyor timedelta.days.


1
Bu yaklaşımın kazandığı durumlar vardır. Örneğin, 2019-07-09 23:50 ve 2019-07-10 00:10 arasındaki gerçek fark yirmi dakikadır. (d1 - d0).daysdöner 0, d1.toordinal() - d0.toordinal()döner 1. Gerçek kullanım alanınızda neye ihtiyacınız olduğuna bağlıdır.
peter.slizik

bu yaklaşım aslında tarih ve tarihi karşılaştırabilir. Örneğin, 2020-04-17 == 2020-04017 00:00:00
Harry Duong

2

Tarih ve saatleri hesaplamak için birkaç seçenek var, ancak basit bir yol yazacağım:

from datetime import timedelta, datetime, date
import dateutil.relativedelta

# current time
date_and_time = datetime.datetime.now()
date_only = date.today()
time_only = datetime.datetime.now().time()

# calculate date and time
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)

# calculate dates: years (-/+)
result = date_only - dateutil.relativedelta.relativedelta(years=10)

# months
result = date_only - dateutil.relativedelta.relativedelta(months=10)

# days
result = date_only - dateutil.relativedelta.relativedelta(days=10)

# calculate time 
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
result.time()

Umarım yardımcı olur


1

from datetime import date
def d(s):
  [month, day, year] = map(int, s.split('/'))
  return date(year, month, day)
def days(start, end):
  return (d(end) - d(start)).days
print days('8/18/2008', '9/26/2008')

Bu, elbette, tarihlerinizin formatta olduğunu zaten doğruladığınızı varsayar r'\d+/\d+/\d+'.


1
Bu, 8 yıl önce verilen cevaplara kıyasla yeni bir şey eklemiyor. -1.
Mark Amery

1
Temel fark, diğer cevapların çoğunun OP'nin tarihlerini dizeleri olduğu gerçeğini açıklamaktan bile rahatsız olmadı. Ve bunu açıklayanlar, kesinlikle gerekenden çok daha karmaşık formatlayıcılar kullandılar. Yani, ana fark şudur map(int, s.split('/')). Tam olarak çığır açıcı değil, ama yine de bu soru oldukça aptalca temel. Cevabım sadece kedinin derisi için başka bir yol gösteriyor.
Parthian Shot

Ayrıca, tarihlerin doğru biçimde olduğunu doğrulayan ve bir ilk yaklaşım doğrulama normal ifadesi verdiğinden de bahsetti. Diğerleri yapmadı.
Parthian Shot

1

İşte bu sorunla başa çıkmanın üç yolu:

from datetime import datetime

Now = datetime.now()
StartDate = datetime.strptime(str(Now.year) +'-01-01', '%Y-%m-%d')
NumberOfDays = (Now - StartDate)

print(NumberOfDays.days)                     # Starts at 0
print(datetime.now().timetuple().tm_yday)    # Starts at 1
print(Now.strftime('%j'))                    # Starts at 1
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.