[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 timedelta, date

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"))

NB : 내장 range()함수 와 일관성을 유지 하기 위해이 반복은 도달 하기 전에 중지됩니다 end_date. 포괄적 인 반복을 위해 다음과 같이 다음과 같이 사용하십시오 range().


답변

이것은 더 분명 할 수 있습니다.

from datetime import date, timedelta

start_date = date(2019, 1, 1)
end_date = date(2020, 1, 1)
delta = timedelta(days=1)
while start_date <= end_date:
    print (start_date.strftime("%Y-%m-%d"))
    start_date += delta


답변

dateutil라이브러리를 사용하십시오 .

from datetime import date
from dateutil.rrule import rrule, DAILY

a = date(2009, 5, 30)
b = date(2009, 6, 9)

for dt in rrule(DAILY, dtstart=a, until=b):
    print dt.strftime("%Y-%m-%d")

이 python 라이브러리에는보다 고급 기능이 많이 있으며 relative deltas와 같이 매우 유용 하며 프로젝트에 쉽게 포함되는 단일 파일 (모듈)로 구현됩니다.


답변

팬더는 일반적으로 시계열에 적합하며 날짜 범위를 직접 지원합니다.

import pandas as pd
daterange = pd.date_range(start_date, end_date)

그런 다음 날짜 범위를 반복하여 날짜를 인쇄 할 수 있습니다.

for single_date in daterange:
    print (single_date.strftime("%Y-%m-%d"))

또한 인생을 편하게 해주는 많은 옵션이 있습니다. 예를 들어 평일 만 원한다면 bdate_range로 바꾸면됩니다. 보다http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps를 하십시오

Pandas의 강력한 기능은 실제로 데이터 프레임으로, 대량의 데이터에 대한 작업을 매우 빠르고 쉽게 수행하는 벡터화 된 작업 (numpy와 매우 유사)을 지원합니다.

편집 : for 루프를 완전히 건너 뛰고 직접 인쇄하면 쉽고 효율적입니다.

print(daterange)


답변

import datetime

def daterange(start, stop, step=datetime.timedelta(days=1), inclusive=False):
  # inclusive=False to behave like range by default
  if step.days > 0:
    while start < stop:
      yield start
      start = start + step
      # not +=! don't modify object passed in if it's mutable
      # since this function is not restricted to
      # only types from datetime module
  elif step.days < 0:
    while start > stop:
      yield start
      start = start + step
  if inclusive and start == stop:
    yield start

# ...

for date in daterange(start_date, end_date, inclusive=True):
  print strftime("%Y-%m-%d", date.timetuple())

이 함수는 음수 단계 등을 지원하여 엄격하게 요구하는 것 이상을 수행합니다. 범위 논리를 고려하지 않는 한 분리 할 필요가 없으며 day_count가장 중요하게는 여러 함수에서 함수를 호출 할 때 코드를 쉽게 읽을 수 있습니다. 장소.


답변

이것은 내가 생각할 수있는 가장 사람이 읽을 수있는 솔루션입니다.

import datetime

def daterange(start, end, step=datetime.timedelta(1)):
    curr = start
    while curr < end:
        yield curr
        curr += step


답변

시도해 보지 않겠습니까?

import datetime as dt

start_date = dt.datetime(2012, 12,1)
end_date = dt.datetime(2012, 12,5)

total_days = (end_date - start_date).days + 1 #inclusive 5 days

for day_number in range(total_days):
    current_date = (start_date + dt.timedelta(days = day_number)).date()
    print current_date