복붙노트

[PYTHON] 간격 사이의 datetimes 목록 생성

PYTHON

간격 사이의 datetimes 목록 생성

두 datetimes (start_date 및 end_date) 감안할 때, 나는이 두 날짜 사이에 다른 datetimes의 목록을 생성하고 싶습니다, 새로운 datetimes는 가변 간격으로 구분됩니다. 예 : 2011-10-10과 2011-12-12 사이의 4 일마다 또는 현재와 내일 사이의 매 8 시간마다 19p.m.

어쩌면 Dateperiod PHP 클래스와 대략 동일 할 수도 있습니다.

파이썬에서 이것을 달성하는 가장 효율적인 방법은 무엇입니까?

해결법

  1. ==============================

    1.datetime.timedelta 사용 :

    datetime.timedelta 사용 :

    from datetime import date, datetime, timedelta
    
    def perdelta(start, end, delta):
        curr = start
        while curr < end:
            yield curr
            curr += delta
    
    >>> for result in perdelta(date(2011, 10, 10), date(2011, 12, 12), timedelta(days=4)):
    ...     print result
    ...
    2011-10-10
    2011-10-14
    2011-10-18
    2011-10-22
    2011-10-26
    2011-10-30
    2011-11-03
    2011-11-07
    2011-11-11
    2011-11-15
    2011-11-19
    2011-11-23
    2011-11-27
    2011-12-01
    2011-12-05
    2011-12-09
    

    날짜와 datetime 개체 모두에서 작동합니다. 두 번째 예 :

    >>> for result in perdelta(datetime.now(),
    ...         datetime.now().replace(hour=19) + timedelta(days=1),
    ...         timedelta(hours=8)):
    ...     print result
    ... 
    2012-05-21 17:25:47.668022
    2012-05-22 01:25:47.668022
    2012-05-22 09:25:47.668022
    2012-05-22 17:25:47.668022
    
  2. ==============================

    2.이 시도:

    이 시도:

    from datetime import datetime
    from dateutil.relativedelta import relativedelta
    
    def date_range(start_date, end_date, increment, period):
        result = []
        nxt = start_date
        delta = relativedelta(**{period:increment})
        while nxt <= end_date:
            result.append(nxt)
            nxt += delta
        return result
    

    질문의 예는 "현재와 내일 사이의 매 8 시간마다 19:00"이 다음과 같이 작성됩니다.

    start_date = datetime.now()
    end_date = start_date + relativedelta(days=1)
    end_date = end_date.replace(hour=19, minute=0, second=0, microsecond=0)
    date_range(start_date, end_date, 8, 'hours')    
    

    period의 유효한 값은 relativedelta 상대 정보에 대해 정의 된 값인 'years', 'months', 'weeks', 'days', 'hours', 'seconds', 'microseconds'입니다.

    내 솔루션은 질문에서 필요에 따라 목록을 반환합니다. @MartijnPieters가 대답하는 것처럼 모든 요소를 ​​한 번에 필요로하지 않으면 생성기를 사용할 수 있습니다.

  3. ==============================

    3.@Martijn Pieters와 @ Óscar López의 답변이 정말 마음에 들었습니다. 이 두 답변 사이에 내 솔루션을 제안하겠습니다.

    @Martijn Pieters와 @ Óscar López의 답변이 정말 마음에 들었습니다. 이 두 답변 사이에 내 솔루션을 제안하겠습니다.

    from datetime import date, datetime, timedelta
    
    def datetime_range(start, end, delta):
        current = start
        if not isinstance(delta, timedelta):
            delta = timedelta(**delta)
        while current < end:
            yield current
            current += delta
    
    
    start = datetime(2015,1,1)
    end = datetime(2015,1,31)
    
    #this unlocks the following interface:
    for dt in datetime_range(start, end, {'days': 2, 'hours':12}):
        print dt
        print dt
    
    2015-01-01 00:00:00
    2015-01-03 12:00:00
    2015-01-06 00:00:00
    2015-01-08 12:00:00
    2015-01-11 00:00:00
    2015-01-13 12:00:00
    2015-01-16 00:00:00
    2015-01-18 12:00:00
    2015-01-21 00:00:00
    2015-01-23 12:00:00
    2015-01-26 00:00:00
    2015-01-28 12:00:00
    
  4. ==============================

    4.여기에 제시된 해결책은 timedelta를 사용하여 일, 시간 등의 간격으로 잘 작동하며 타사 라이브러리에 의존하려는 경우 dateutil.relativedelta가 지원하는 솔루션입니다. 하지만 yyyymm 형식으로 월별 간격의 특정 사례에 대한 솔루션을 공유하고 싶습니다. 여기에서 질문했지만 (이 질문의 중복으로 표시되어 있습니다.)

    여기에 제시된 해결책은 timedelta를 사용하여 일, 시간 등의 간격으로 잘 작동하며 타사 라이브러리에 의존하려는 경우 dateutil.relativedelta가 지원하는 솔루션입니다. 하지만 yyyymm 형식으로 월별 간격의 특정 사례에 대한 솔루션을 공유하고 싶습니다. 여기에서 질문했지만 (이 질문의 중복으로 표시되어 있습니다.)

    def iterate_months(start_ym, end_ym):
        for ym in range(int(start_ym), int(end_ym) + 1):
            if ym % 100 > 12 or ym % 100 == 0:
                continue
            yield str(ym)
    
    list(iterate_months('201710', '201803'))
    

    산출:

    ['201710', '201711', '201712', '201801', '201802', '201803']
    

    이 솔루션은 yyyymm 형식 지정에 대한이 특정 요구 사항에 상당히 구체적입니다 (적어도 내 세계에서는 자주 사용되지만). 많은 수의 연속 응답 중에서 가장 효율적인 대답은 아니지만 간결하고 쉽게 사용할 수있는 이점이 있습니다. 이해하고 많은 라이브러리 또는 날짜 변환 코드를 포함하지 않습니다.

  5. from https://stackoverflow.com/questions/10688006/generate-a-list-of-datetimes-between-an-interval by cc-by-sa and MIT license