728x90
반응형
질문 : Python에서 날짜 범위 반복
이 작업을 수행하는 다음 코드가 있지만 어떻게 더 잘 할 수 있습니까? 지금은 중첩 루프보다 낫다고 생각하지만 목록 이해에 생성기가 있으면 Perl-one-linerish를 얻기 시작합니다.
day_count = (end_date - start_date).days + 1 for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]: print strftime("%Y-%m-%d", single_date.timetuple())
- 나는 실제로 이것을 인쇄하는 데 사용하지 않습니다. 데모 용입니다.
start_date
및end_date
변수는 타임 스탬프가 필요하지 않기 때문에datetime.date
(보고서를 생성하는 데 사용됩니다).
시작일이 2009-05-30
이고 종료일이 2009-06-09
:
2009-05-30 2009-05-31 2009-06-01 2009-06-02 2009-06-03 2009-06-04 2009-06-05 2009-06-06 2009-06-07 2009-06-08 2009-06-09
답변
두 개의 중첩 된 반복이있는 이유는 무엇입니까? 나를 위해 그것은 단 한 번의 반복으로 동일한 데이터 목록을 생성합니다.
for single_date in (start_date + timedelta(n) for n in range(day_count)): print ...
그리고 목록이 저장되지 않고 하나의 생성기 만 반복됩니다. 또한 생성기의 "if"는 불필요한 것 같습니다.
결국 선형 시퀀스에는 두 개가 아닌 하나의 반복자 만 필요합니다.
John Machin과의 토론 후 업데이트:
아마도 가장 우아한 솔루션은 생성기 함수를 사용하여 날짜 범위에 대한 반복을 완전히 숨기거나 줄이는 것입니다.
from datetime import date, timedelta def daterange(start_date, end_date): for n in range(int((end_date - start_date).days)): yield start_date + timedelta(n) start_date = date(2013, 1, 1) end_date = date(2015, 6, 2) for single_date in daterange(start_date, end_date): print(single_date.strftime("%Y-%m-%d"))
range()
함수와의 일관성을 위해이 반복 end_date
에 도달 하기 전에 중지됩니다. 따라서 포괄적 인 반복을 위해서는 range()
에서처럼 다음 날을 사용하십시오.
출처 : https://stackoverflow.com/questions/1060279/iterating-through-a-range-of-dates-in-python
728x90
반응형
'프로그래밍 언어 > Python' 카테고리의 다른 글
객체에 Python 속성이 있는지 확인하는 방법 (0) | 2022.02.01 |
---|---|
버전 제어 하에서 IPython 노트북 사용 (0) | 2022.02.01 |
Python의 알파벳 범위 (0) | 2022.01.17 |
Python 파일의 일반적인 헤더 형식 (0) | 2022.01.17 |
mysqldb python 인터페이스를 설치할 때 mysql_config를 찾을 수 없을 경우 (0) | 2022.01.17 |