Diferencia entre dos fechas en Python


137

Tengo dos fechas diferentes y quiero saber la diferencia en días entre ellas. El formato de la fecha es AAAA-MM-DD.

Tengo una función que puede AGREGAR o RESTAR un número dado a una fecha:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

donde A es la fecha yx la cantidad de días que quiero agregar. Y el resultado es otra fecha.

Necesito una función donde pueda dar dos fechas y el resultado sería un int con diferencia de fecha en días.



Tenga en cuenta que su función addonDays fallará en los días de horario de verano.
— fishinear

Tienes razón. Ya modifico la función. Si agrega 3600 (una hora) funcionará.
— mauguerra

Respuestas:


272

Use -para obtener la diferencia entre dos datetimeobjetos y tomar el daysmiembro.

from datetime import datetime

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

37
Gran respuesta. Para ser claros, el resultado de (d2 - d1)será un timedeltaobjeto.
— aganders3

Tengo este error en la consola: el objeto de tipo 'datetime.datetime' no tiene atributo 'strptime'
— mauguerra

2
Obtengo TypeError: el objeto 'int' no es invocable cuando intento hacer .days () en un objeto timedelta y la documentación tampoco lo menciona ( docs.python.org/2/library/datetime.html ).
— user1761806

44
¿Podrías mencionar total_secondstambién? Creo que es importante, ya que es lo que esperaba obtener cuando lo intenté secondssin leer los documentos.
— Martin Thoma

1
@ThejKiran Haga que d2 y d1 estén separados exactamente un día y vea si es lo que espera ;-)
— Martin Thoma

27

Otra solución corta:

from datetime import date

def diff_dates(date1, date2):
    return abs(date2-date1).days

def main():
    d1 = date(2013,1,1)
    d2 = date(2013,9,13)
    result1 = diff_dates(d2, d1)
    print '{} days between {} and {}'.format(result1, d1, d2)
    print ("Happy programmer's day!")

main()

3
¿No es completamente innecesario ifen la diff_datesfunción? Por la definición del valor absoluto, abs(date1-date2)siempre será igual a abs(date2-date1).
— Blckknght

Al menos con Python3.5, la declaración de impresión debería verse así: print ('{} días entre {} y {}'. Formato (resultado1, d1, d2))
— Ernestas Kardzys

2

Probé el código publicado por larsmans arriba, pero hay un par de problemas:

1) El código como está arrojará el error mencionado por mauguerra 2) Si cambia el código a lo siguiente:

...
    d1 = d1.strftime("%Y-%m-%d")
    d2 = d2.strftime("%Y-%m-%d")
    return abs((d2 - d1).days)

Esto convertirá tus objetos de fecha y hora en cadenas pero, dos cosas

1) Intentar hacer d2 - d1 fallará ya que no puede usar el operador menos en las cadenas y 2) Si lee la primera línea de la respuesta anterior que se indica, desea usar el operador - en dos objetos de fecha y hora pero, simplemente los convirtió en cadenas

Lo que encontré es que, literalmente, solo necesitas lo siguiente:

import datetime

end_date = datetime.datetime.utcnow()
start_date = end_date - datetime.timedelta(days=8)
difference_in_days = abs((end_date - start_date).days)

print difference_in_days

1
Mi código usa datetime.strptimepara convertir cadenas en datetimeobjetos. Como el OP declaró que "El formato de la fecha es AAAA-MM-DD", supuse que las fechas se representaban como cadenas. Si no lo están, obviamente no hay necesidad de una conversión.
— Fred Foo

0

Prueba esto:

data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv')
data.head(5)
first=data['1st Gift']
last=data['Last Gift']
maxi=data['Largest Gift']
l_1=np.mean(first)-3*np.std(first)
u_1=np.mean(first)+3*np.std(first)


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
pd.value_counts(m)
l=first[m]
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
data['1st Gift'].head()




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
pd.value_counts(m)
l=last[m]
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
data['Last Gift'].head()

-4

pd.date_range ('2019-01-01', '2019-02-01'). shape [0]

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.