파이썬에서 날짜 범위 만들기 싶습니다. 이것보다 더 좋은

오늘부터 100 일까지 임의의 일 수로 돌아가는 날짜 목록을 만들고 싶습니다. 이것보다 더 좋은 방법이 있습니까?

import datetime

a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
print dateList



답변

조금 더 나은 …

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(numdays)]


답변

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

예를 들면 pd.date_range()다음과 같습니다.

import pandas as pd
from datetime import datetime

datelist = pd.date_range(datetime.today(), periods=100).tolist()

또한 인생을 편하게 해주는 많은 옵션이 있습니다. 예를 들어 평일 만 원한다면로 바꾸면됩니다 bdate_range.

날짜 범위 설명서를 참조하십시오

또한 pytz 시간대를 완벽하게 지원하며 스프링 / 가을 DST 시프트에 부드럽게 적용 할 수 있습니다.

OP로 수정 :

Pandas 타임 스탬프와 달리 실제 파이썬 날짜 시간이 필요한 경우 :

import pandas as pd
from datetime import datetime

pd.date_range(end = datetime.today(), periods = 100).to_pydatetime().tolist()

#OR

pd.date_range(start="2018-09-09",end="2020-02-02")

“end”매개 변수를 사용하여 원래 질문과 일치하지만 내림차순 날짜를 원하는 경우 :

pd.date_range(datetime.today(), periods=100).to_pydatetime().tolist()


답변

지정된 시작 날짜와 종료 날짜 사이의 날짜 범위를 가져옵니다 (시간 및 공간 복잡성에 최적화 됨).

import datetime

start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]

for date in date_generated:
    print date.strftime("%d-%m-%Y")


답변

오늘부터 시작하는 날짜 객체를 반환하는 생성기 함수를 작성할 수 있습니다.

import datetime

def date_generator():
  from_date = datetime.datetime.today()
  while True:
    yield from_date
    from_date = from_date - datetime.timedelta(days=1)

이 생성기는 오늘부터 시작하여 한 번에 하루 씩 거꾸로 날짜를 반환합니다. 처음 3 일을 취하는 방법은 다음과 같습니다.

>>> import itertools
>>> dates = itertools.islice(date_generator(), 3)
>>> list(dates)
[datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]

루프 또는 목록 이해에 비해이 방법의 장점은 원하는만큼 여러 번 되돌아 갈 수 있다는 것입니다.

편집하다

함수 대신 생성기 표현식을 사용하는보다 컴팩트 한 버전 :

date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())

용법:

>>> dates = itertools.islice(date_generator, 3)
>>> list(dates)
[datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]


답변

예, 바퀴를 재발 명하십시오 …. 포럼을 검색하면 다음과 같은 것을 얻을 수 있습니다 :

from dateutil import rrule
from datetime import datetime

list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now()))


답변

요일 서수를 사용하여 더 간단하게 만들 수도 있습니다.

def date_range(start_date, end_date):
    for ordinal in range(start_date.toordinal(), end_date.toordinal()):
        yield datetime.date.fromordinal(ordinal)

또는 의견에서 제안한 것처럼 다음과 같은 목록을 만들 수 있습니다.

date_range = [
    datetime.date.fromordinal(ordinal)
    for ordinal in range(
        start_date.toordinal(),
        end_date.toordinal(),
    )
]


답변

이 질문의 제목에서 나는 range()두 개의 날짜를 지정하고 사이에있는 모든 날짜가있는 목록을 만들 수있는 것과 같은 것을 찾을 것으로 기대했습니다 . 그렇게하면 미리 알 수없는 경우 두 날짜 사이의 일 수를 계산할 필요가 없습니다.

따라서 주제를 약간 벗어난 위험이 있기 때문에이 단일 라이너는 다음 작업을 수행합니다.

import datetime
start_date = datetime.date(2011, 01, 01)
end_date   = datetime.date(2014, 01, 01)

dates_2011_2013 = [ start_date + datetime.timedelta(n) for n in range(int ((end_date - start_date).days))]

이 답변에 대한 모든 크레딧 !