Khi bạn chưa làm việc với Python3 và do đó không thể sử dụng các đối tượng hiệu quả của bộ nhớ range
, bạn có thể tạo một tên được đặt trong the answer you link to (nếu không bạn cũng có thể sử dụng đối tượng range
mới). Từ đó, tất cả các bạn cần làm là sử dụng datetime.date.fromordinal
trên datarange chồng chéo:
>>> from datetime import date
>>> from collections import namedtuple
>>> Range = namedtuple('Range', ['start', 'end'])
>>> r1 = Range(start=date(2016, 1, 1), end=date(2016, 2, 5))
>>> r2 = Range(start=date(2016, 1, 28), end=date(2016, 2, 28))
>>> latest_start = max(r1.start, r2.start)
>>> earliest_end = min(r1.end, r2.end)
>>> overlap = (earliest_end - latest_start).days + 1
>>> overlapping_dates = [] # default
>>> if overlap > 0:
... overlapping_dates = range(latest_start.toordinal(), earliest_end.toordinal() + 1) # as numbers
... overlapping_dates = [ date.fromordinal(x) for x in overlapping_dates ] # back to datetime.date objects
...
>>> overlapping_dates
[datetime.date(2016, 1, 28),
datetime.date(2016, 1, 29),
datetime.date(2016, 1, 30),
datetime.date(2016, 1, 31),
datetime.date(2016, 2, 1),
datetime.date(2016, 2, 2),
datetime.date(2016, 2, 3),
datetime.date(2016, 2, 4),
datetime.date(2016, 2, 5)]
Một cách tiếp cận sử dụng set
sẽ làm việc quá (một trong những cách tiếp cận là trong lịch sử sửa đổi của câu trả lời này), nhưng thường là kém hiệu quả, bởi vì nó phải có tất cả ngày trong bộ nhớ, ngay cả những ngày không ở trong giao lộ.
Cảm ơn Kardaj! chỉ cần tự hỏi về phần hiệu suất, tại sao đúc thành chuỗi sẽ cải thiện hiệu suất? – tkyass
Vì trong trường hợp bạn định tạo nhiều ngày, bạn muốn lưu trữ cấu trúc dữ liệu ít phức tạp hơn như một chuỗi trong trường hợp này, sẽ không dẫn đến mất thông tin. – kardaj