Diferença entre duas datas em Python

137

Tenho duas datas diferentes e quero saber a diferença de dias entre elas. O formato da data é AAAA-MM-DD.

Eu tenho uma função que pode adicionar ou subtrair um determinado número a uma data:

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

onde A é a data e x o número de dias que eu quero adicionar. E o resultado é outra data.

Eu preciso de uma função na qual eu possa dar duas datas e o resultado seria um int com diferença de data em dias.

mauguerra
fonte
Observe que sua função addonDays falhará nos dias do horário de verão.
fishinear próximo de 04/08/16
Você está certo. Eu já modifiquei a função. Se você adicionar 3600 (uma hora) funcionará.
mauguerra

Respostas:

270

Use -para obter a diferença entre dois datetimeobjetos e levar o daysmembro.

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
fonte
37
Ótima resposta. Para ser claro, o resultado de (d2 - d1)será um timedeltaobjeto.
usar o seguinte código
Eu tenho este erro no console: o objeto de tipo 'datetime.datetime' não tem atributo 'strptime'
mauguerra
2
Eu recebo TypeError: o objeto 'int' não pode ser chamado quando tento fazer .days () em um objeto timedelta e a documentação também não faz menção a ele ( docs.python.org/2/library/datetime.html ).
user1761806
4
Você poderia mencionar total_secondstambém? Eu acho que é importante, pois é o que eu esperava obter quando tentei secondssem ler os documentos.
Martin Thoma
1
@ThejKiran Faça D2 e D1 nos separar exatamente um dia e ver se é o que você espera ;-)
Martin Thoma
27

Outra solução curta:

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
fonte
3
A função ifin não é diff_datescompletamente desnecessária? Pela definição do valor absoluto, abs(date1-date2)sempre será igual aabs(date2-date1) .
Blckknght
Pelo menos com o Python3.5, a instrução print deve ficar assim: print ('{} dias entre {} e {}'. Formato (resultado1, d1, d2))
Ernestas Kardzys
2

Eu tentei o código postado por larsmans acima, mas existem alguns problemas:

1) O código como está lançará o erro conforme mencionado por mauguerra 2) Se você alterar o código para o seguinte:

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

Isso converterá seus objetos de data e hora em seqüências de caracteres, mas duas coisas

1) A tentativa de executar o d2 - d1 falhará, pois você não pode usar o operador menos nas seqüências de caracteres e 2) Se você ler a primeira linha da resposta acima indicada, deseja usar o operador - em dois objetos de data e hora, mas apenas converteu-os em strings

O que descobri é que você literalmente precisa apenas do seguinte:

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
fonte
1
Meu código usa datetime.strptimepara converter seqüências de caracteres em datetimeobjetos. Como o OP declarou que "O formato da data é AAAA-MM-DD", presumi que as datas fossem representadas como seqüências de caracteres. Caso contrário, obviamente não há necessidade de conversão.
Fred Foo
0

Tente o seguinte:

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()
user8359392
fonte
-4

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

ar91
fonte