[PYTHON] 간격 사이의 datetimes 목록 생성
PYTHON간격 사이의 datetimes 목록 생성
두 datetimes (start_date 및 end_date) 감안할 때, 나는이 두 날짜 사이에 다른 datetimes의 목록을 생성하고 싶습니다, 새로운 datetimes는 가변 간격으로 구분됩니다. 예 : 2011-10-10과 2011-12-12 사이의 4 일마다 또는 현재와 내일 사이의 매 8 시간마다 19p.m.
어쩌면 Dateperiod PHP 클래스와 대략 동일 할 수도 있습니다.
파이썬에서 이것을 달성하는 가장 효율적인 방법은 무엇입니까?
해결법
-
==============================
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.이 시도:
이 시도:
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.@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.여기에 제시된 해결책은 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 형식 지정에 대한이 특정 요구 사항에 상당히 구체적입니다 (적어도 내 세계에서는 자주 사용되지만). 많은 수의 연속 응답 중에서 가장 효율적인 대답은 아니지만 간결하고 쉽게 사용할 수있는 이점이 있습니다. 이해하고 많은 라이브러리 또는 날짜 변환 코드를 포함하지 않습니다.
from https://stackoverflow.com/questions/10688006/generate-a-list-of-datetimes-between-an-interval by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] python selenium 버튼을 클릭하십시오. (0) | 2018.10.08 |
---|---|
[PYTHON] 파이썬에서 BOM 문자로 유니 코드 파일 데이터 읽기 (0) | 2018.10.08 |
[PYTHON] URL에서 Pandas read_csv (0) | 2018.10.08 |
[PYTHON] 파이썬의 인터프리터 출력을 캡처하고 텍스트 위젯에 표시하는 방법? (0) | 2018.10.08 |
[PYTHON] ATLAS / MKL을 설치된 Numpy에 연결하십시오 (0) | 2018.10.08 |