Câu trả lời:
Nếu bạn có hai đối tượng ngày, bạn chỉ có thể trừ chúng, tính toán một timedelta
đối tượng.
from datetime import date
d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)
Phần có liên quan của các tài liệu: https://docs.python.org/l Library / datetime.html .
Xem câu trả lời này cho một ví dụ khác.
Sử dụng sức mạnh của 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
vẫn thiếu tương đương với chính nó strptime()
.
strptime
các format
arg? Nên rõ ràng với ngày arg đầu tiên có định dạng.
Ngày cho đến Giáng sinh:
>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86
Số học nhiều hơn ở đây .
Bạn muốn mô-đun datetime.
>>> from datetime import datetime, timedelta
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
Một vi dụ khac:
>>> 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
Như đã chỉ ra ở đây
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()
, rất hữu ích khi chưa biết ngày so sánh trước và đó là sự khác biệt mà bạn quan tâm. Nếu ngày thứ hai của bạn datetime.strptime(date, date)
muộn hơn ngày đầu tiên, kết quả sẽ âm. abs()
làm cho tất cả đầu vào tuyệt đối (tức là tích cực).
Nó cũng có thể dễ dàng thực hiện với arrow
:
import arrow
a = arrow.get('2017-05-09')
b = arrow.get('2017-05-11')
delta = (b-a)
print delta.days
Để tham khảo: http://arrow.readthedocs.io/en/latest/
không sử dụng Lib chỉ là mã thuần túy:
#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()
mọi người đã trả lời một cách xuất sắc bằng cách sử dụng ngày, hãy để tôi thử trả lời bằng cách sử dụng gấu trúc
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
Điều này sẽ đưa ra câu trả lời. Trong trường hợp một trong những đầu vào là cột dataframe. chỉ cần sử dụng dt.days thay cho ngày
(dt1-dt).dt.days
Ngoài ra còn có một datetime.toordinal()
phương pháp chưa được đề cập:
import datetime
print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal()) # 39
https://docs.python.org/3/lvern/datetime.html#datetime.date.toordinal
date.
toordinal ()Trả lại thứ tự Gregorian proleptic của ngày, trong đó ngày 1 tháng 1 năm 1 có thứ tự 1. Đối với bất kỳ
date
đối tượng d ,date.fromordinal(d.toordinal()) == d
.
Có vẻ rất phù hợp để tính chênh lệch ngày, mặc dù không thể đọc được timedelta.days
.
(d1 - d0).days
trả lại 0
, d1.toordinal() - d0.toordinal()
trả lại 1
. Phụ thuộc vào những gì bạn cần trong usecase thực tế của bạn.
Để tính ngày và giờ, có một số tùy chọn nhưng tôi sẽ viết theo cách đơn giản:
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()
Hy vọng nó giúp
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')
Tất nhiên, điều này giả định rằng bạn đã xác minh rằng ngày của bạn ở định dạng r'\d+/\d+/\d+'
.
map(int, s.split('/'))
. Không chính xác đột phá, nhưng một lần nữa câu hỏi này là khá cơ bản ngu ngốc. Câu trả lời của tôi chỉ cho thấy một cách khác để da mèo.
Dưới đây là ba cách để giải quyết vấn đề này:
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
sangpython datetime
stackoverflow.com/questions/52982056/