Відповіді:
Якщо у вас є два об'єкти дати, ви можете просто відняти їх, який обчислює timedelta
об'єкт.
from datetime import date
d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)
Відповідний розділ документів: https://docs.python.org/library/datetime.html .
Дивіться цю відповідь для іншого прикладу.
Використовуючи потужність дати:
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
все ще не вистачає власного еквівалента strptime()
.
strptime
в format
ARG? Повинно бути зрозумілим з першою датою аргументу, яка має формат.
Дні до Різдва:
>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86
Більше арифметики тут .
Вам потрібен модуль дати.
>>> from datetime import datetime, timedelta
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
Ще один приклад:
>>> 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
Як зазначено тут
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()
, що корисно, коли порівняні дати заздалегідь невідомі, і саме вас цікавить різниця. Якщо ваша друга дата datetime.strptime(date, date)
пізніше першої дати, результат буде негативним. abs()
робить увесь вхід абсолютним (тобто позитивним).
Це також можна легко зробити за допомогою arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b-a)
print delta.days
Довідково: http://arrow.readthedocs.io/en/latest/
без використання Lib просто чистого коду:
#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()
всі чудово відповіли, використовуючи дату, дозвольте спробувати відповісти, використовуючи панди
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
Це дасть відповідь. У випадку, коли одним із вхідних даних є стовпчик фрейму даних. просто використовуйте dt.days замість днів
(dt1-dt).dt.days
Існує також datetime.toordinal()
метод, про який ще не говорилося:
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.
координатний ()Повернення передує григоріанський порядкових дат, де 1 січень 1 року має порядковий номер 1. Для будь-якого
date
об'єкта я ,date.fromordinal(d.toordinal()) == d
.
Здається, добре підходить для розрахунку різниці днів, хоча і не настільки читабельна, як timedelta.days
.
(d1 - d0).days
повертає 0
, d1.toordinal() - d0.toordinal()
повертає 1
. Залежить від того, що вам потрібно у вашому фактичному шафі.
Для обчислення дат і часу є кілька варіантів, але я напишу простий спосіб:
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()
Сподіваюся, це допомагає
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')
Це, звичайно, передбачає, що ви вже підтвердили, що ваші дати у форматі r'\d+/\d+/\d+'
.
map(int, s.split('/'))
. Не зовсім новаторський, але знову ж таки це питання досить дурне основне. Моя відповідь якраз і показує інший спосіб зібрати кота.
Ось три способи вирішити цю проблему:
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 / ...