오늘부터 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))]
이 답변에 대한 모든 크레딧 !