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.

mauguerra
fuente
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)
Fred Foo
fuente
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()
0x8BADF00D
fuente
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
schalkneethling
fuente
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()
usuario8359392
fuente
-4

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

ar91
fuente