Odpowiedzi:
Jeśli masz dwa obiekty daty, możesz je odjąć, co spowoduje obliczenie timedelta
obiektu.
from datetime import date
d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)
Odpowiednia sekcja dokumentów: https://docs.python.org/library/datetime.html .
Zobacz tę odpowiedź na inny przykład.
Wykorzystując moc datetime:
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
wciąż brakuje własnego odpowiednika strptime()
.
strptime
się format
argumentu? Powinno być jasne z pierwszą datą arg, która ma format.
Dni do Bożego Narodzenia:
>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86
Więcej arytmetyki tutaj .
Chcesz moduł datetime.
>>> from datetime import datetime, timedelta
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
Inny przykład:
>>> 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
Jak wskazano tutaj
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()
, co jest przydatne, gdy porównywane daty są wcześniej nieznane i jest to różnica, którą jesteś zainteresowany. Jeśli druga data datetime.strptime(date, date)
przypada później niż pierwsza data, wynik będzie ujemny. abs()
powoduje, że wszystkie dane wejściowe są bezwzględne (tj. pozytywne)
Można to również łatwo zrobić za pomocą arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b-a)
print delta.days
W celach informacyjnych: http://arrow.readthedocs.io/en/latest/
bez użycia Lib tylko czysty 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()
wszyscy doskonale odpowiedzieli na tę datę, pozwólcie, że spróbuję odpowiedzieć za pomocą pand
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
To da odpowiedź. W przypadku, gdy jednym z danych wejściowych jest kolumna ramki danych. po prostu użyj dt.days zamiast dni
(dt1-dt).dt.days
Istnieje również datetime.toordinal()
metoda, o której jeszcze nie wspomniano:
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 ()Zwraca proleptic gregoriański porządkowa o terminie, w którym 01 stycznia 1 rok porządkowej 1. Dla każdego
date
obiektu d ,date.fromordinal(d.toordinal()) == d
.
Wydaje się, że dobrze nadaje się do obliczania różnicy dni, choć nie tak czytelny jak timedelta.days
.
(d1 - d0).days
zwraca 0
, d1.toordinal() - d0.toordinal()
zwraca 1
. Zależy od tego, czego potrzebujesz w rzeczywistym przypadku użycia.
Do obliczania dat i godzin istnieje kilka opcji, ale napiszę prosty sposób:
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()
Mam nadzieję, że to pomoże
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')
Zakłada się oczywiście, że już sprawdziłeś, czy twoje daty są w formacie r'\d+/\d+/\d+'
.
map(int, s.split('/'))
. Nie do końca przełomowe, ale z drugiej strony to pytanie jest dość głupie. Moja odpowiedź pokazuje tylko inny sposób na skórowanie kota.
Oto trzy sposoby rozwiązania tego problemu:
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
dopython datetime
stackoverflow.com/questions/52982056/...