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 |