วนซ้ำตามช่วงวันที่ใน Python


367

ฉันมีรหัสต่อไปนี้เพื่อทำสิ่งนี้ แต่ฉันจะทำได้ดีกว่าได้อย่างไร ตอนนี้ฉันคิดว่ามันดีกว่าลูปซ้อนกัน แต่มันเริ่มรับ 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

3
เพียงเพื่อชี้ให้เห็น: ฉันไม่คิดว่าจะมีความแตกต่างระหว่าง 'time.strftime ("% Y-% m-% d", single_date.timetuple ())' และ 'single_date.strftime ที่สั้นลง ("% Y-% m-% d ")' คำตอบส่วนใหญ่ดูเหมือนจะคัดลอกสไตล์ที่ยาวขึ้น
Mu Mind

8
ว้าวคำตอบเหล่านี้ซับซ้อนเกินไป ลองทำสิ่งนี้: stackoverflow.com/questions/7274267/…
Gringo Suave

@GringoSuave: อะไรที่ซับซ้อนเกี่ยวกับคำตอบของ Sean Cavanagh ?
jfs

แอปพลิเคชั่น: โกงบน GitHub streaks: stackoverflow.com/questions/20099235/…
Ciro Santilli 郝海东冠状冠状病六四事件法轮功

1
ทำซ้ำหรือไม่คุณจะได้รับคำตอบที่ง่ายกว่าในหน้าอื่น ๆ
Gringo Suave

คำตอบ:


552

เหตุใดจึงมีการทำซ้ำสองรายการซ้อนกัน สำหรับฉันมันสร้างรายการข้อมูลเดียวกันโดยมีการวนซ้ำเพียงครั้งเดียว:

for single_date in (start_date + timedelta(n) for n in range(day_count)):
    print ...

และไม่มีรายการใดถูกจัดเก็บตัวกำเนิดซ้ำเดียวเท่านั้นจะถูกทำซ้ำ ด้วย "ถ้า" ในเครื่องกำเนิดไฟฟ้าดูเหมือนว่าไม่จำเป็น

ท้ายที่สุดลำดับเชิงเส้นควรต้องการเพียงหนึ่งตัววนซ้ำไม่ใช่สองตัว

อัพเดทหลังจากการสนทนากับ 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"))

หมายเหตุ: สำหรับความสอดคล้องกับในตัวrange()ฟังก์ชั่นนี้จะหยุดการทำซ้ำก่อนที่จะend_dateถึง range()ดังนั้นสำหรับการย้ำรวมใช้ในวันถัดไปที่คุณจะมี


4
-1 ... มีการคำนวณเบื้องต้นของ day_count และการใช้ช่วงไม่น่ากลัวเมื่อง่าย ๆ ในขณะที่วงจะพอเพียง
John Machin

7
@John Machin: โอเค ฉันทำสิ่งนี้ซ้ำแล้วซ้ำอีกในขณะที่มีการวนซ้ำอย่างชัดเจนของตัวนับหรือค่าบางอย่าง รูปแบบ interation นั้นเป็นแบบ pythonic มากกว่า (อย่างน้อยในมุมมองส่วนตัวของฉัน) และยังเป็นแบบทั่วไปมากกว่าเพราะมันช่วยให้สามารถแสดงการวนซ้ำในขณะที่ซ่อนรายละเอียดของการวนซ้ำนั้น
เบอร์

10
@Ber: ฉันไม่ชอบเลย มันแย่มาก คุณมีการทำซ้ำแล้ว! ด้วยการรวมโครงสร้างที่สร้างขึ้นไว้ในเครื่องกำเนิดไฟฟ้าไว้คุณได้เพิ่มค่าใช้จ่ายในการดำเนินการมากขึ้นและหันเหความสนใจของผู้ใช้ไปยังที่อื่นเพื่ออ่านรหัสและ / หรือเอกสารของผู้ให้บริการ 3 ราย -2
John Machin

8
@John Machin: ฉันไม่เห็นด้วย จุดไม่ได้เกี่ยวกับการลดจำนวนบรรทัดให้น้อยที่สุด ท้ายที่สุดเราไม่ได้พูดภาษา Perl ที่นี่ นอกจากนี้โค้ดของฉันทำซ้ำเพียงครั้งเดียว (นั่นเป็นวิธีที่ตัวสร้างทำงานได้ แต่ฉันเดาว่าคุณรู้) *** ประเด็นของฉันเกี่ยวกับแนวคิดที่เป็นนามธรรมสำหรับการใช้ซ้ำและรหัสอธิบายตนเอง ฉันยืนยันว่านี่เป็นสิ่งที่คุ้มค่ายิ่งกว่าที่จะมีรหัสสั้นที่สุดเท่าที่จะเป็นไปได้
เบอร์

9
หากคุณต้องการความกระชับคุณสามารถใช้นิพจน์ตัวสร้าง:(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
Mark Ransom

219

นี่อาจชัดเจนกว่า:

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

3
ชัดเจนและสั้นมาก แต่ใช้งานไม่ได้หากคุณต้องการใช้งานต่อ
rslite

ใช้งานได้ดีกับเคสของฉันในการใช้งาน
doomdaam

169

ใช้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")

ห้องสมุดไพ ธ อนนี้มีคุณสมบัติขั้นสูงมากมายบางอย่างมีประโยชน์มากเช่นrelative deltas - และนำมาใช้เป็นไฟล์เดียว (โมดูล) ที่รวมอยู่ในโครงการได้อย่างง่ายดาย


3
โปรดทราบว่าวันสุดท้ายในการห่วงที่นี่เป็นที่รวมของuntilในขณะที่วันสุดท้ายของdaterangeวิธีการในคำตอบที่เบอร์ของเป็นพิเศษend_dateของ
Ninjakannon

docs ที่ทันสมัยมากขึ้นdateutil.readthedocs.io/en/stable/rrule.html
qwr

77

Pandas นั้นยอดเยี่ยมสำหรับอนุกรมเวลาโดยทั่วไปและได้รับการสนับสนุนโดยตรงสำหรับช่วงวันที่

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

จากนั้นคุณสามารถวนซ้ำ daterange เพื่อพิมพ์วันที่:

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)

"like like numpy" - Pandas ถูกสร้างบน numpy: P
Zach Saucier

15
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และที่สำคัญที่สุดรหัสจะกลายเป็นง่ายต่อการอ่าน สถานที่


ขอขอบคุณเปลี่ยนชื่อให้ตรงกับพารามิเตอร์ของช่วงอย่างใกล้ชิดมากขึ้นลืมที่จะเปลี่ยนแปลงในร่างกาย

+1 ... แต่เมื่อคุณอนุญาตให้ขั้นตอนเป็น timedelta คุณควร (ก) เรียกว่า dateTIMErange () และทำขั้นตอนเช่น timedelta (ชั่วโมง = 12) และ timedelta (ชั่วโมง = 36) ทำงานอย่างถูกต้องหรือ ( b) ขั้นตอนการดักจับที่ไม่ใช่จำนวนวันหรือ (c) บันทึกผู้โทรให้ยุ่งยากและแสดงขั้นตอนเป็นจำนวนวันแทนที่จะเป็น timedelta
John Machin

timedelta ใด ๆ ควรใช้งานได้ แต่ฉันเพิ่ม datetime_range และ date_range ลงในคอลเล็กชันเรื่องที่สนใจส่วนบุคคลของฉันหลังจากเขียนสิ่งนี้เนื่องจาก (ก) ไม่แน่ใจว่ามีฟังก์ชั่นอื่นที่คุ้มค่าสำหรับ (c), กรณีที่พบบ่อยที่สุดของวัน = 1 ได้รับการดูแลแล้วและต้องผ่าน timedelta อย่างชัดเจนเพื่อหลีกเลี่ยงความสับสน อาจจะอัปโหลดที่ใดก็ได้ที่ดีที่สุด: bitbucket.org/kniht/scraps/src/tip/python/gen_range.py

เพื่อให้การทำงานนี้เพิ่มขึ้นนอกเหนือจากวันที่คุณควรตรวจสอบกับ step.total_seconds () และไม่ใช่ step.days
amohr

12

นี่เป็นทางออกที่มนุษย์อ่านง่ายที่สุดที่ฉันนึกได้

import datetime

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

11

ทำไมไม่ลอง:

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

7

arangeฟังก์ชันของ Numpy สามารถใช้กับวันที่:

import numpy as np
from datetime import datetime, timedelta
d0 = datetime(2009, 1,1)
d1 = datetime(2010, 1,1)
dt = timedelta(days = 1)
dates = np.arange(d0, d1, dt).astype(datetime)

การใช้astypeคือการแปลงจากnumpy.datetime64ไปยังอาร์เรย์ของdatetime.datetimeวัตถุ


การก่อสร้างที่บางเฉียบสุด ๆ ! บรรทัดสุดท้ายใช้ได้กับฉันด้วยdates = np.arange(d0, d1, dt).astype(datetime.datetime)
pyano

+1 สำหรับการโพสต์โซลูชัน one-liner ทั่วไปซึ่งอนุญาตให้ใช้ timedelta ใด ๆ แทนขั้นตอนการปัดเศษแบบคงที่เช่นรายชั่วโมง / นาที / …
F.Raab

7

แสดง n วันสุดท้ายนับจากวันนี้:

import datetime
for i in range(0, 100):
    print((datetime.date.today() + datetime.timedelta(i)).isoformat())

เอาท์พุท:

2016-06-29
2016-06-30
2016-07-01
2016-07-02
2016-07-03
2016-07-04

โปรดเพิ่มวงเล็บเหลี่ยมแบบprint((datetime.date.today() + datetime.timedelta(i)).isoformat())
TitanFighter

@ TitanFighter โปรดแก้ไขฉันจะยอมรับพวกเขา
user1767754

2
ฉันเหนื่อย. การแก้ไขต้องมีอย่างน้อย 6 ตัวอักษร แต่ในกรณีนี้จำเป็นต้องเพิ่มเพียง 2 ตัวอักษร "(" และ ")"
TitanFighter

print((datetime.date.today() + datetime.timedelta(i)))ไม่มี. isoformat () ให้ผลลัพธ์เดียวกันทั้งหมด ฉันต้องการสคริปต์ของฉันเพื่อพิมพ์ YYMMDD ใครรู้วิธีการทำเช่นนั้น?
mr.zog

เพียงทำสิ่งนี้ในการวนรอบแทนการพิมพ์คำสั่งd = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
user1767754

5
import datetime

def daterange(start, stop, step_days=1):
    current = start
    step = datetime.timedelta(step_days)
    if step_days > 0:
        while current < stop:
            yield current
            current += step
    elif step_days < 0:
        while current > stop:
            yield current
            current += step
    else:
        raise ValueError("daterange() step_days argument must not be zero")

if __name__ == "__main__":
    from pprint import pprint as pp
    lo = datetime.date(2008, 12, 27)
    hi = datetime.date(2009, 1, 5)
    pp(list(daterange(lo, hi)))
    pp(list(daterange(hi, lo, -1)))
    pp(list(daterange(lo, hi, 7)))
    pp(list(daterange(hi, lo, -7))) 
    assert not list(daterange(lo, hi, -1))
    assert not list(daterange(hi, lo))
    assert not list(daterange(lo, hi, -7))
    assert not list(daterange(hi, lo, 7)) 


4

เพื่อความสมบูรณ์ Pandas ยังมีperiod_rangeฟังก์ชั่นสำหรับการประทับเวลาที่อยู่นอกขอบเขต:

import pandas as pd

pd.period_range(start='1/1/1626', end='1/08/1627', freq='D')

3

ฉันมีปัญหาที่คล้ายกัน แต่ฉันต้องทำซ้ำทุกเดือนแทนที่จะเป็นรายวัน

นี่คือทางออกของฉัน

import calendar
from datetime import datetime, timedelta

def days_in_month(dt):
    return calendar.monthrange(dt.year, dt.month)[1]

def monthly_range(dt_start, dt_end):
    forward = dt_end >= dt_start
    finish = False
    dt = dt_start

    while not finish:
        yield dt.date()
        if forward:
            days = days_in_month(dt)
            dt = dt + timedelta(days=days)            
            finish = dt > dt_end
        else:
            _tmp_dt = dt.replace(day=1) - timedelta(days=1)
            dt = (_tmp_dt.replace(day=dt.day))
            finish = dt < dt_end

ตัวอย่างที่ 1

date_start = datetime(2016, 6, 1)
date_end = datetime(2017, 1, 1)

for p in monthly_range(date_start, date_end):
    print(p)

เอาท์พุต

2016-06-01
2016-07-01
2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

ตัวอย่างที่ 2

date_start = datetime(2017, 1, 1)
date_end = datetime(2016, 6, 1)

for p in monthly_range(date_start, date_end):
    print(p)

เอาท์พุต

2017-01-01
2016-12-01
2016-11-01
2016-10-01
2016-09-01
2016-08-01
2016-07-01
2016-06-01

3

สามารถ'T * เชื่อว่าคำถามนี้มีอยู่ 9 ปีโดยไม่มีใครแนะนำฟังก์ชันเวียนง่าย:

from datetime import datetime, timedelta

def walk_days(start_date, end_date):
    if start_date <= end_date:
        print(start_date.strftime("%Y-%m-%d"))
        next_date = start_date + timedelta(days=1)
        walk_days(next_date, end_date)

#demo
start_date = datetime(2009, 5, 30)
end_date   = datetime(2009, 6, 9)

walk_days(start_date, end_date)

เอาท์พุท:

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

แก้ไข: * ตอนนี้ฉันเชื่อแล้ว - ดูPython ปรับหางแบบเรียกซ้ำให้เหมาะสมหรือไม่ . ขอบคุณทิม


3
เหตุใดคุณจึงต้องแทนที่การวนรอบแบบง่ายด้วยการเรียกซ้ำ การแบ่งช่วงนี้จะนานกว่าสองปีครึ่ง
ทิมเออร์วิน

@ Tim-Erwin สุจริตฉันไม่มีความคิด CPython ไม่ปรับการเรียกซ้ำหางให้เหมาะสมดังนั้นความคิดเห็นของคุณจึงมีค่า
Pocketsand

2

คุณสามารถสร้างชุดวันที่ระหว่างวันที่สองวันโดยใช้ห้องสมุดหมีแพนด้าอย่างง่ายดายและไว้วางใจ

import pandas as pd

print pd.date_range(start='1/1/2010', end='1/08/2018', freq='M')

คุณสามารถเปลี่ยนความถี่ของการสร้างวันที่โดยการตั้งค่าความถี่เป็น D, M, Q, Y (รายวันรายเดือนรายไตรมาสรายปี)


ตอบแล้วในหัวข้อนี้ในปี 2014
Alexey Vazhnov

2
> pip install DateTimeRange

from datetimerange import DateTimeRange

def dateRange(start, end, step):
        rangeList = []
        time_range = DateTimeRange(start, end)
        for value in time_range.range(datetime.timedelta(days=step)):
            rangeList.append(value.strftime('%m/%d/%Y'))
        return rangeList

    dateRange("2018-09-07", "2018-12-25", 7)  

    Out[92]: 
    ['09/07/2018',
     '09/14/2018',
     '09/21/2018',
     '09/28/2018',
     '10/05/2018',
     '10/12/2018',
     '10/19/2018',
     '10/26/2018',
     '11/02/2018',
     '11/09/2018',
     '11/16/2018',
     '11/23/2018',
     '11/30/2018',
     '12/07/2018',
     '12/14/2018',
     '12/21/2018']

1

ฟังก์ชั่นนี้มีคุณสมบัติพิเศษบางอย่าง:

  • สามารถผ่านสตริงที่ตรงกับ DATE_FORMAT สำหรับการเริ่มต้นหรือสิ้นสุดและมันจะถูกแปลงเป็นวัตถุวันที่
  • สามารถผ่านวัตถุวันที่สำหรับการเริ่มต้นหรือสิ้นสุด
  • การตรวจสอบข้อผิดพลาดในกรณีที่จุดสิ้นสุดมีอายุมากกว่าจุดเริ่มต้น

    import datetime
    from datetime import timedelta
    
    
    DATE_FORMAT = '%Y/%m/%d'
    
    def daterange(start, end):
          def convert(date):
                try:
                      date = datetime.datetime.strptime(date, DATE_FORMAT)
                      return date.date()
                except TypeError:
                      return date
    
          def get_date(n):
                return datetime.datetime.strftime(convert(start) + timedelta(days=n), DATE_FORMAT)
    
          days = (convert(end) - convert(start)).days
          if days <= 0:
                raise ValueError('The start date must be before the end date.')
          for n in range(0, days):
                yield get_date(n)
    
    
    start = '2014/12/1'
    end = '2014/12/31'
    print list(daterange(start, end))
    
    start_ = datetime.date.today()
    end = '2015/12/1'
    print list(daterange(start, end))

1

นี่คือรหัสสำหรับฟังก์ชันช่วงวันที่ทั่วไปซึ่งคล้ายกับคำตอบของ Ber แต่มีความยืดหยุ่นมากกว่า:

def count_timedelta(delta, step, seconds_in_interval):
    """Helper function for iterate.  Finds the number of intervals in the timedelta."""
    return int(delta.total_seconds() / (seconds_in_interval * step))


def range_dt(start, end, step=1, interval='day'):
    """Iterate over datetimes or dates, similar to builtin range."""
    intervals = functools.partial(count_timedelta, (end - start), step)

    if interval == 'week':
        for i in range(intervals(3600 * 24 * 7)):
            yield start + datetime.timedelta(weeks=i) * step

    elif interval == 'day':
        for i in range(intervals(3600 * 24)):
            yield start + datetime.timedelta(days=i) * step

    elif interval == 'hour':
        for i in range(intervals(3600)):
            yield start + datetime.timedelta(hours=i) * step

    elif interval == 'minute':
        for i in range(intervals(60)):
            yield start + datetime.timedelta(minutes=i) * step

    elif interval == 'second':
        for i in range(intervals(1)):
            yield start + datetime.timedelta(seconds=i) * step

    elif interval == 'millisecond':
        for i in range(intervals(1 / 1000)):
            yield start + datetime.timedelta(milliseconds=i) * step

    elif interval == 'microsecond':
        for i in range(intervals(1e-6)):
            yield start + datetime.timedelta(microseconds=i) * step

    else:
        raise AttributeError("Interval must be 'week', 'day', 'hour' 'second', \
            'microsecond' or 'millisecond'.")

0

เกี่ยวกับสิ่งต่อไปนี้สำหรับการเพิ่มช่วงวัน

for d in map( lambda x: startDate+datetime.timedelta(days=x), xrange( (stopDate-startDate).days ) ):
  # Do stuff here
  • startDate และ stopDate เป็นวัตถุ datetime.date

สำหรับรุ่นทั่วไป:

for d in map( lambda x: startTime+x*stepTime, xrange( (stopTime-startTime).total_seconds() / stepTime.total_seconds() ) ):
  # Do stuff here
  • startTime และ stopTime เป็นวัตถุ datetime.date หรือ datetime.datetime วัตถุ (ทั้งคู่ควรเป็นประเภทเดียวกัน)
  • stepTime เป็นวัตถุ timedelta

โปรดทราบว่า. total_seconds () ได้รับการสนับสนุนเฉพาะหลังจาก python 2.7 หากคุณติดอยู่กับเวอร์ชั่นก่อนหน้านี้คุณสามารถเขียนฟังก์ชั่นของคุณเอง:

def total_seconds( td ):
  return float(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

0

วิธีการที่แตกต่างกันเล็กน้อยกับขั้นตอนที่ย้อนกลับได้โดยการเก็บrangeargs ใน tuple

def date_range(start, stop, step=1, inclusive=False):
    day_count = (stop - start).days
    if inclusive:
        day_count += 1

    if step > 0:
        range_args = (0, day_count, step)
    elif step < 0:
        range_args = (day_count - 1, -1, step)
    else:
        raise ValueError("date_range(): step arg must be non-zero")

    for i in range(*range_args):
        yield start + timedelta(days=i)

0
import datetime
from dateutil.rrule import DAILY,rrule

date=datetime.datetime(2019,1,10)

date1=datetime.datetime(2019,2,2)

for i in rrule(DAILY , dtstart=date,until=date1):
     print(i.strftime('%Y%b%d'),sep='\n')

เอาท์พุท:

2019Jan10
2019Jan11
2019Jan12
2019Jan13
2019Jan14
2019Jan15
2019Jan16
2019Jan17
2019Jan18
2019Jan19
2019Jan20
2019Jan21
2019Jan22
2019Jan23
2019Jan24
2019Jan25
2019Jan26
2019Jan27
2019Jan28
2019Jan29
2019Jan30
2019Jan31
2019Feb01
2019Feb02

ยินดีต้อนรับสู่ Stack Overflow! ในขณะที่รหัสนี้อาจแก้ปัญหารวมถึงคำอธิบายว่าทำไมและวิธีแก้ปัญหานี้โดยเฉพาะคำถามที่มีคำตอบที่ดีมากเกินไปจะช่วยปรับปรุงคุณภาพการโพสต์ของคุณและอาจส่งผลให้มีผู้โหวตมากขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่เพียงแค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้ จากการตรวจสอบ
ดับเบิ้ล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.