2017-04-19 7 views
2

(start_date, end_date) 튜플 목록에서 누락 날짜를 식별하는 방법은 무엇입니까?시작일 및 종료일 목록에서 누락 일을 식별하는 방법은 무엇입니까?

예를 들어

, 아래 목록에없는 날짜를 확인하는 방법 :

dates = [('2011-01-01', '2011-01-14'), ('2011-01-15','2011-01-31'), 
     ('2011-02-01', '2011-02-14'), ('2011-03-01', '2011-03-14'), 
     ('2011-03-16', '2011-03-31')] 

위의 예에는 다음 실종 날짜 :

  • 2011-02-15
  • 2011-03-15
2011-02-28

어떻게 식별합니까? 시작일과 종료일 튜플 목록에서 요일을 발행합니까?

+0

는 같은 달 동안 일을 추가하고 실제 필요한 일에 conpare. – Rahul

+0

출력을 정확히 보이게하려면 어떻게해야합니까? – timgeb

+0

@timgeb 누락 날짜 목록으로 이상적으로 – Greg

답변

1

비트 자세한,하지만 당신은 아이디어를

편집을 얻을 :

missing_dates_list = list(missing_dates) 

또는 다시 아쉬워에 : 조금

from datetime import date, timedelta 

dates = [('2011-01-01', '2011-01-14'), ('2011-01-15','2011-01-31'), 
     ('2011-02-01', '2011-02-14'), ('2011-03-01', '2011-03-14'), 
     ('2011-03-16', '2011-03-31')] 

def d_range(d1,d2): 
    delta = d2 - d1 #assumes second date is always after first 
    return [d1 + timedelta(days=i) for i in range(delta.days + 1)] 

my_days = [] 

#calc the date range between each tuple 
for d in dates: 

    d1 = datetime.strptime(d[0],'%Y-%m-%d') 
    d2 = datetime.strptime(d[1],'%Y-%m-%d') 

    my_days.extend(d_range(d1,d2)) 


#now do the same for the max and min dates 
my_range = d_range(min(my_days), max(my_days)) 


missing_dates = set(my_range).difference(set(my_days)) 

그리고 당신의 코멘트를 해결하기 위해 그것을 정리 원본 형식 :

missing_dates_str = [datetime.strftime(date, '%Y-%m-%d') for date in missing_dates] 
더 객체 지향 방식으로
1

솔루션 :

from functools import total_ordering 
from datetime import timedelta, datetime 


@total_ordering 
class DateRange(object): 
    def __init__(self, start, end): 
     assert start <= end 
     self.start = start 
     self.end = end 

    def __contains__(self, other): 
     return self.start <= other and self.end >= other 

    def __lt__(self, other): 
     if self.start == other.start: 
      return self.end < other.end 
     return self.start < other.start 

    def __eq__(self, other): 
     return self.start == other.start and self.end == other.end 

    def __str__(self): 
     return '<%s, %s>' % (self.start.strftime('%Y-%m-%d'), self.end.strftime('%Y-%m-%d')) 

    def __iter__(self): 
     class DateIterator(object): 
      def __init__(self, start, end): 
       self.current = start 
       self.end = end 

      def next(self): 
       if self.current > self.end: 
        raise StopIteration() 
       self.current += timedelta(days=1) 
       return self.current 

     return DateIterator(self.start, self.end) 

    __repr__ = __str__ 

dates = [('2011-01-01', '2011-01-14'), ('2011-01-15','2011-01-31'), ('2011-02-01','2011-02-14'), ('2011-03-01','2011-03-14'), ('2011-03-16','2011-03-31')] 
dates = [DateRange(datetime.strptime(start, '%Y-%m-%d'), datetime.strptime(end, '%Y-%m-%d')) for start, end in dates] 
dates = sorted(dates) 

missing = [] 

previous = None 
for date_range in dates: 
    if previous is not None and previous < date_range.start: 
     missing.append(DateRange(previous, date_range.start + timedelta(days=-1))) 

    previous = date_range.end + timedelta(days=1) 

print missing