Perbedaan antara dua tanggal dalam Python

137

Saya memiliki dua tanggal yang berbeda dan saya ingin tahu perbedaan hari di antara mereka. Format tanggalnya adalah YYYY-MM-DD.

Saya memiliki fungsi yang dapat MENAMBAHKAN atau MENGUNDANG nomor yang diberikan ke suatu tanggal:

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

di mana A adalah tanggal dan x jumlah hari yang ingin saya tambahkan. Dan hasilnya adalah kencan lain.

Saya memerlukan fungsi di mana saya dapat memberikan dua tanggal dan hasilnya akan menjadi int dengan perbedaan tanggal dalam hari.

mauguerra
sumber
Perhatikan bahwa fungsi addonDays Anda akan gagal pada hari DST.
Fishinear
Kamu benar. Saya sudah memodifikasi fungsinya. Jika Anda menambahkan 3600 (satu jam) akan berhasil.
mauguerra

Jawaban:

272

Gunakan -untuk mendapatkan perbedaan antara dua datetimeobjek dan mengambil daysanggota.

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
sumber
37
Jawaban yang bagus Agar jelas, hasil dari (d2 - d1)akan menjadi timedeltaobjek.
aganders3
Saya memiliki kesalahan ini di konsol: ketik objek 'datetime.datetime' tidak memiliki atribut 'strptime'
mauguerra
2
Saya mendapatkan TypeError: objek 'int' tidak dapat dipanggil ketika saya mencoba melakukan .days () pada objek timedelta dan dokumentasi tidak menyebutkannya ( docs.python.org/2/library/datetime.html ).
user1761806
4
Bisakah Anda sebutkan total_secondsjuga? Saya pikir ini penting karena itulah yang saya harapkan ketika saya mencoba secondstanpa membaca dokumen.
Martin Thoma
1
@ThejKiran Membuat d2 dan d1 terpisah tepat satu hari dan lihat apakah itu yang Anda harapkan ;-)
Martin Thoma
27

Solusi singkat lainnya:

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
sumber
3
Bukankah ifdalam diff_datesfungsi sama sekali tidak perlu? Dengan definisi nilai absolut, abs(date1-date2)akan selalu sama dengan abs(date2-date1).
Blckknght
Setidaknya dengan Python3.5 pernyataan cetak akan terlihat seperti ini: format print ('{} hari antara {} dan {}' (result1, d1, d2))
Ernestas Kardzys
2

Saya mencoba kode yang diposting oleh larsman di atas tetapi, ada beberapa masalah:

1) Kode apa adanya akan melempar kesalahan sebagaimana disebutkan oleh mauguerra 2) Jika Anda mengubah kode sebagai berikut:

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

Ini akan mengonversi objek datetime Anda menjadi string tetapi, dua hal

1) Mencoba melakukan d2 - d1 akan gagal karena Anda tidak dapat menggunakan operator minus pada string dan 2) Jika Anda membaca baris pertama dari jawaban di atas yang dinyatakan, Anda ingin menggunakan - operator pada dua objek datetime tetapi, Anda hanya perlu mengubahnya menjadi string

Apa yang saya temukan adalah bahwa Anda benar-benar hanya memerlukan yang berikut ini:

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
sumber
1
Kode saya digunakan datetime.strptimeuntuk mengonversi string menjadi datetimeobjek. Karena OP menyatakan bahwa "Format tanggal adalah YYYY-MM-DD", saya berasumsi bahwa tanggal diwakili sebagai string. Jika tidak, jelas tidak perlu konversi.
Fred Foo
0

Coba ini:

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()
pengguna8359392
sumber
-4

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

ar91
sumber