2011-11-24 36 views
77

¿Cuál es la forma más corta de ver cuántos días completos han pasado entre dos fechas? Esto es lo que estoy haciendo ahora.Días entre dos fechas en Python

math.floor((b - a).total_seconds()/float(86400)) 
+1

¿Son solo dos fechas, o también incluyen información de tiempo? –

+1

Ah - vea también http://stackoverflow.com/questions/151199/how-do-i-calculate-number-of-days-betwen-two-dates-using-python –

Respuesta

146

Suponiendo que hemos literalmente, tiene dos objetos de fecha, puede restar una de la otra y consultar el timedelta object resultante para el número de días:

>>> from datetime import date 
>>> a = date(2011,11,24) 
>>> b = date(2011,11,17) 
>>> a-b 
datetime.timedelta(7) 
>>> (a-b).days 
7 

y funciona con datetimes también - creo que redondea a la baja hasta el día más cercana:

>>> from datetime import datetime 
>>> a = datetime(2011,11,24,0,0,0) 
>>> b = datetime(2011,11,17,23,59,59) 
>>> a-b 
datetime.timedelta(6, 1) 
>>> (a-b).days 
6 
+1

Coolness. De alguna manera siempre asumí que "días" se refiere a la porción del día de la diferencia. Entonces, por ejemplo, la diferencia entre 2010 y 2011 sería de 0 días y 1 año, pero resulta que sí informa los 365 días que yo quería. – Bemmu

+0

@Bemmu: ah sí - Creo que 'timedelta' no informa ninguna unidad por más de días (aunque podría estar equivocado). –

4

Probar:

(b-a).days 

He intentado con b y uno del tipo datetime.date.

28

¿Te refieres a días calendario completos, o grupos de 24 horas?

por el simple hecho de 24 horas, asumiendo que usted está utilizando la fecha y hora de Python, entonces el objeto timedelta ya tiene un día propiedad:

days = (a - b).days 

Por días naturales, que necesita para redondear un día a la más cercana y b hasta el día cercano, la eliminación de la jornada parcial en cualquier lado:

roundedA = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
days = (roundedA - roundedB).days 
+3

buen lugar con la diferencia en días de calendario frente a 24 horas. Una pregunta es por qué agregas 1 día. Creo que lo anterior funciona perfectamente sin eso. –

+0

Ese es el cheque por días calendario. Diga A es 2013-06-18 a las 16:00 y B es 2013-06-19 a las 02:00; un día calendario ha pasado, pero (B - A) .days devolverá cero porque el delta es de solo 10 horas. – DNS

+0

Ese es el punto que estoy haciendo DNS. Tu código devuelve 2 porque has agregado otro día. Sin agregar 1 día, devuelve 1. ¿Por qué agregar un día? –

4

referencia a mis comentarios sobre otras respuestas. Así es como calcularía la diferencia en días en base a 24 horas y días de calendario. el atributo de días funciona bien durante 24 horas y la función funciona mejor para las verificaciones del calendario.

from datetime import timedelta, datetime 

def cal_days_diff(a,b): 

    A = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
    B = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
    return (A - B).days 

if __name__ == '__main__': 

    x = datetime(2013, 06, 18, 16, 00) 
    y = datetime(2013, 06, 19, 2, 00) 

    print (y - x).days   # 0 
    print cal_days_diff(y, x) # 1 

    z = datetime(2013, 06, 20, 2, 00) 

    print (z - x).days   # 1 
    print cal_days_diff(z, x) # 2 
Cuestiones relacionadas