프로그래밍 언어/Python

Python에서 날짜 범위 반복 하는 방법

Rateye 2022. 1. 17. 12:08
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_dateend_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
반응형