Yanıtlar:
İki tarih nesneniz varsa, bir timedelta
nesneyi hesaplayan bunları çıkarabilirsiniz .
from datetime import date
d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)
Dokümanların ilgili bölümü: https://docs.python.org/library/datetime.html .
Başka bir örnek için bu cevaba bakınız .
Tarih saatinin gücünü kullanma:
from datetime import datetime
date_format = "%m/%d/%Y"
a = datetime.strptime('8/18/2008', date_format)
b = datetime.strptime('9/26/2008', date_format)
delta = b - a
print delta.days # that's it
date
hala kendi eşdeğeri eksik strptime()
.
strptime
format
Noel'e Kadar Geçen Gün Sayısı:
>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86
Daha aritmetik burada .
Datetime modülünü istiyorsunuz.
>>> from datetime import datetime, timedelta
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
Başka bir örnek:
>>> import datetime
>>> today = datetime.date.today()
>>> print(today)
2008-09-01
>>> last_year = datetime.date(2007, 9, 1)
>>> print(today - last_year)
366 days, 0:00:00
Belirttiği gibi burada
delta = today - last_year
print(delta.days)
from datetime import datetime
start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")
print abs((end_date-start_date).days)
abs()
, karşılaştırılan tarihler önceden bilinmediğinde yararlıdır ve ilgilendiğiniz farktır. İkinci tarihiniz datetime.strptime(date, date)
ilk tarihten sonra ise, sonuç negatif olacaktır. abs()
tüm girdileri mutlak yapar (yani pozitif).
Ayrıca aşağıdakilerle kolayca yapılabilir arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b-a)
print delta.days
Referans için: http://arrow.readthedocs.io/en/latest/
Lib kullanmadan sadece saf kod:
#Calculate the Days between Two Date
daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def isLeapYear(year):
# Pseudo code for this algorithm is found at
# http://en.wikipedia.org/wiki/Leap_year#Algorithm
## if (year is not divisible by 4) then (it is a common Year)
#else if (year is not divisable by 100) then (ut us a leap year)
#else if (year is not disible by 400) then (it is a common year)
#else(it is aleap year)
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
def Count_Days(year1, month1, day1):
if month1 ==2:
if isLeapYear(year1):
if day1 < daysOfMonths[month1-1]+1:
return year1, month1, day1+1
else:
if month1 ==12:
return year1+1,1,1
else:
return year1, month1 +1 , 1
else:
if day1 < daysOfMonths[month1-1]:
return year1, month1, day1+1
else:
if month1 ==12:
return year1+1,1,1
else:
return year1, month1 +1 , 1
else:
if day1 < daysOfMonths[month1-1]:
return year1, month1, day1+1
else:
if month1 ==12:
return year1+1,1,1
else:
return year1, month1 +1 , 1
def daysBetweenDates(y1, m1, d1, y2, m2, d2,end_day):
if y1 > y2:
m1,m2 = m2,m1
y1,y2 = y2,y1
d1,d2 = d2,d1
days=0
while(not(m1==m2 and y1==y2 and d1==d2)):
y1,m1,d1 = Count_Days(y1,m1,d1)
days+=1
if end_day:
days+=1
return days
# Test Case
def test():
test_cases = [((2012,1,1,2012,2,28,False), 58),
((2012,1,1,2012,3,1,False), 60),
((2011,6,30,2012,6,30,False), 366),
((2011,1,1,2012,8,8,False), 585 ),
((1994,5,15,2019,8,31,False), 9239),
((1999,3,24,2018,2,4,False), 6892),
((1999,6,24,2018,8,4,False),6981),
((1995,5,24,2018,12,15,False),8606),
((1994,8,24,2019,12,15,True),9245),
((2019,12,15,1994,8,24,True),9245),
((2019,5,15,1994,10,24,True),8970),
((1994,11,24,2019,8,15,True),9031)]
for (args, answer) in test_cases:
result = daysBetweenDates(*args)
if result != answer:
print "Test with data:", args, "failed"
else:
print "Test case passed!"
test()
herkes tarihi kullanarak mükemmel cevap verdi, pandaları kullanarak cevaplamaya çalışayım
dt = pd.to_datetime('2008/08/18', format='%Y/%m/%d')
dt1 = pd.to_datetime('2008/09/26', format='%Y/%m/%d')
(dt1-dt).days
Bu cevap verecektir. Girişlerden birinin veri çerçevesi sütunu olması durumunda. sadece gün yerine dt.days kullanın
(dt1-dt).dt.days
Henüz datetime.toordinal()
belirtilmeyen bir yöntem de vardır :
import datetime
print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal()) # 39
https://docs.python.org/3/library/datetime.html#datetime.date.toordinal
date.
toordinal ()Yılın 1 Ocak 1 herhangi biri için sıra 1. sahiptir tarihe ait ilerisini düşünerek Gregoryen ordinal İade
date
nesne d ,date.fromordinal(d.toordinal()) == d
.
O kadar okunabilir olmasa da, gün farkını hesaplamak için çok uygun görünüyor timedelta.days
.
(d1 - d0).days
döner 0
, d1.toordinal() - d0.toordinal()
döner 1
. Gerçek kullanım alanınızda neye ihtiyacınız olduğuna bağlıdır.
Tarih ve saatleri hesaplamak için birkaç seçenek var, ancak basit bir yol yazacağım:
from datetime import timedelta, datetime, date
import dateutil.relativedelta
# current time
date_and_time = datetime.datetime.now()
date_only = date.today()
time_only = datetime.datetime.now().time()
# calculate date and time
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
# calculate dates: years (-/+)
result = date_only - dateutil.relativedelta.relativedelta(years=10)
# months
result = date_only - dateutil.relativedelta.relativedelta(months=10)
# days
result = date_only - dateutil.relativedelta.relativedelta(days=10)
# calculate time
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
result.time()
Umarım yardımcı olur
from datetime import date
def d(s):
[month, day, year] = map(int, s.split('/'))
return date(year, month, day)
def days(start, end):
return (d(end) - d(start)).days
print days('8/18/2008', '9/26/2008')
Bu, elbette, tarihlerinizin formatta olduğunu zaten doğruladığınızı varsayar r'\d+/\d+/\d+'
.
map(int, s.split('/'))
. Tam olarak çığır açıcı değil, ama yine de bu soru oldukça aptalca temel. Cevabım sadece kedinin derisi için başka bir yol gösteriyor.
İşte bu sorunla başa çıkmanın üç yolu:
from datetime import datetime
Now = datetime.now()
StartDate = datetime.strptime(str(Now.year) +'-01-01', '%Y-%m-%d')
NumberOfDays = (Now - StartDate)
print(NumberOfDays.days) # Starts at 0
print(datetime.now().timetuple().tm_yday) # Starts at 1
print(Now.strftime('%j')) # Starts at 1
np.datetime64
,python datetime
stackoverflow.com/questions/52982056/…