2008-09-29 58 views

Respuesta

480

Si tiene dos objetos de fecha, puede restarlos.

from datetime import date 

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

La sección correspondiente de la documentación: https://docs.python.org/library/datetime.html

+3

que sería mejor ser 'd1 - d0' tener un resultado positivo – Tianqing

88

Usando el poder de fecha y hora:

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

realidad, la clase fecha sería más apropiado en este caso que la fecha y hora. –

+6

@JeremyCantrell Y, sin embargo, incluso ocho años después, 'date' todavía carece de su propio equivalente a' strptime() '. – JAB

19

Días hasta Navidad:

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

Más aritmética here.

7

Desea el módulo de fecha y hora.

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

U otro ejemplo:

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 

Como se señaló here

6
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

Es posible que desee ver esto. Tengo estos errores en 2.7.3 Python ejecutando tu ejemplo. Archivo "", línea 1, en Archivo "/usr/local/lib/python2.7/_strptime.py", línea 325, en _strptime (data_string, formato)) ValueError: los datos de tiempo '8/18/2008 'no coincide con el formato'% Y-% m-% d ' >>> Traza (última llamada más reciente): Archivo "", línea 1, en Archivo "/ usr/local/lib /python2.7/_strptime.py ", línea 325, en _strptime (data_string, formato)) ValueError: datos de tiempo '26/09/2008' no coincide con el formato '% Y-% m-% d' >>> – octopusgrabbus

+0

@octopusgrabbus El formato La versión recientemente editada debería funcionar. – Christopher

+1

Esto no agrega nada nuevo en comparación con las respuestas dadas 4 años antes. -1. –

2

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

Esto supone, por supuesto, que ya has verificado que su las fechas están en el formato r'\d+/\d+/\d+'.

+1

Esto no agrega nada nuevo en comparación con las respuestas dadas 8 años antes. -1. –

+0

La principal diferencia es que la mayoría de las otras respuestas ni siquiera se molestaron en explicar el hecho de que el OP tenía sus fechas como cadenas. Y quienes sí lo hicieron utilizaron en gran medida formateadores más complicados de lo estrictamente necesario. Entonces, la diferencia principal es 'map (int, s.split ('/')) '. No es exactamente innovador, pero una vez más esta pregunta es bastante estúpida básica. Mi respuesta solo muestra otra forma de despellejar al gato. –

+0

También mencionó la validación de que las fechas están en el formato correcto, y dio una expresión regular de validación de primera aproximación. Lo que otros no hicieron –

2

Para el cálculo de fechas y horas hay varias opciones, pero voy a escribir de la manera simple:

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

Espero que ayude

1

sin utilizar Lib código sólo 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() 
Cuestiones relacionadas