【问题标题】:How to step one week (7 days) in a for loop (datetime)如何在 for 循环(日期时间)中步进一周(7 天)
【发布时间】:2018-09-28 19:31:16
【问题描述】:

我有一个这样的 for 循环:

for mydate in daterange (startDate, endDate):

虽然每天都会增加。我希望步骤是一周。 一个技巧是跳过 6 天,但这太糟糕了。 如何做到这一点?

def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)

【问题讨论】:

  • daterange(startDate, endDate) 是函数吗?
  • 您能否详细说明一下为什么跳过 6 天的 hack 会很糟糕?是因为该月的最后一段时间将具有无效值以及您希望溢出的偏好吗?还要给出原因,比如它是一种对数据进行采样的数学方法吗?
  • 只是因为它是 6 个不必要的循环。是的,7 步必须考虑 6 步,但我想它更有效。

标签: python python-datetime


【解决方案1】:

您使用步长为 7 的范围对象并将其添加到开始日期:

import datetime

def daterange(startdate, enddate, steps=1): 
    """Yields dates in increments of steps days from startdate to enddate"""
    numdays = (enddate-startdate).days 
    for x in range (0, numdays, steps):
        yield startdate + datetime.timedelta(days = x)


today = datetime.datetime.today() 
end = today + datetime.timedelta(days=40)

print( list(daterange(today, end, 7)))

输出:

[datetime.datetime(2018, 9, 28, 19, 34, 26, 976681), 
 datetime.datetime(2018, 10, 5, 19, 34, 26, 976681), 
 datetime.datetime(2018, 10, 12, 19, 34, 26, 976681), 
 datetime.datetime(2018, 10, 19, 19, 34, 26, 976681), 
 datetime.datetime(2018, 10, 26, 19, 34, 26, 976681), 
 datetime.datetime(2018, 11, 2, 19, 34, 26, 976681)]

【讨论】:

    【解决方案2】:

    只需在循环中添加步长:

    from datetime import timedelta, date
    
    def daterange(start_date, end_date):
         for n in range(0, int((end_date - start_date).days) + 1, 7):
             yield start_date + timedelta(n)
    
    start_dt = date(2018, 9, 1)
    end_dt = date(2018, 10, 30)
    for dt in daterange(start_dt, end_dt):
        print(dt.strftime("%Y-%m-%d"))
    

    输出:

    2018-09-01
    2018-09-08
    2018-09-15
    2018-09-22
    2018-09-29
    2018-10-06
    2018-10-13
    2018-10-20
    2018-10-27
    

    【讨论】:

    • 我知道你在这里做什么。不过,我认为,您在for 语句中颠倒了这两个的顺序:end_date - start_date
    • @AllLelopath 已修复!
    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多