Se ho due date (ad esempio '8/18/2008'
e '9/26/2008'
) qual è il modo migliore per ottenere il numero di giorni tra le due date?Come si calcola il numero di giorni tra due date usando Python?
risposta
Se si dispone di due oggetti data, è possibile sottrarli.
from datetime import date
d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print delta.days
La sezione della documentazione: https://docs.python.org/library/datetime.html
Usando il potere del datetime:
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
in realtà, la classe data sarebbe più appropriato in questo caso di datetime. –
@JeremyCantrell Eppure, anche otto anni dopo, 'date' non ha ancora il suo equivalente a' strptime() '. – JAB
giorni fino a Natale:
>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86
Più aritmetica here.
Si desidera il modulo datetime.
>>> from datetime import datetime
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
O altro esempio:
Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 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
Come sottolineato here
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)
Si potrebbe voler guardare questo. Ho questi errori su 2.7.3 Python che esegue il tuo esempio. File "
@octopusgrabbus Il formato la stringa era del tutto sbagliata.La versione modificata dovrebbe funzionare – Christopher
Questo non aggiunge nulla di nuovo rispetto alle risposte date 4 anni prima. -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')
Ciò presuppone, naturalmente, che hai già verificato che il vostro le date sono nel formato r'\d+/\d+/\d+'
.
Questo non aggiunge nulla di nuovo rispetto alle risposte date 8 anni prima. -1. –
La differenza principale La maggior parte delle altre risposte non si è nemmeno preoccupata di spiegare il fatto che l'OP aveva le sue date come stringhe e coloro che ne hanno fatto conto hanno usato in gran parte formattatori più complicati di quanto strettamente necessario. int, s.split ('/')) '. Non esattamente rivoluzionario, ma di nuovo questa domanda è piuttosto stupida di base: la mia risposta mostra solo un altro modo per scuoiare il gatto. –
Ha anche menzionato la convalida delle date nel formato corretto e una regex di convalida della prima approssimazione. Quali altri no. –
Anche può essere fatto facilmente con arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b-a)
print delta.days
Per riferimento: http://arrow.readthedocs.io/en/latest/
Per calcolare date e orari ci sono diverse opzioni, ma io scriverò il modo semplice:
import datetime
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()
Spero che sia utile
senza utilizzare il codice Lib solo pura:
#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()
che sarebbe meglio essere 'd1 - d0' ad avere un risultato positivo – Tianqing