【问题标题】:Start and end of a period一个时期的开始和结束
【发布时间】:2018-03-07 16:58:29
【问题描述】:

除了月份之外,有没有办法用weekyear 扩展get_month_day_range() 函数?

方法可以定义为get_day_range(period, date),句号可以是weekmonthyear

import datetime

from dateutil.relativedelta import relativedelta

def get_month_day_range(date):
    """
    For a date 'date' returns the start and end date for the month of 'date'.

    Month with 31 days:
    >>> date = datetime.date(2011, 7, 27)
    >>> get_month_day_range(date)
    (datetime.date(2011, 7, 1), datetime.date(2011, 7, 31))

    Month with 28 days:
    >>> date = datetime.date(2011, 2, 15)
    >>> get_month_day_range(date)
    (datetime.date(2011, 2, 1), datetime.date(2011, 2, 28))
    """
    last_day = date + relativedelta(day=1, months=+1, days=-1)
    first_day = date + relativedelta(day=1)
    return first_day, last_day

if __name__ == "__main__":
    import doctest
    doctest.testmod()

到目前为止我已经得到了这个结果:

def get_period_day_range(date, period='month'):
        last_day = None
        first_day = date + relativedelta(day=1)

        if period == 'month':
            last_day = date + relativedelta(day=1, months=1, days=-1)
        elif period == 'week':
            last_day = date + relativedelta(day=1, weeks=1, days=-1)
        elif period == 'year':
            last_day = date + relativedelta(day=1, years=1, days=-1)
        return first_day, last_day

它不是一直都在工作。它不适用于weekdatetime.datetime(2017, 7, 10)yeardatetime.datetime(2017, 7, 5)。我该如何解决?有什么建议吗?

请注意,该函数的目的是根据我们输入的日期为我们提供某个时期的开始和结束日期。例如,如果我给 datetime.datetime(2017, 7, 10) 的年份,它会给我(datetime.datetime(2017, 1, 1), datetime.datetime(2017, 12, 31)) 或周为datetime.datetime(2017, 7, 5) 输出将是(datetime.datetime(2017, 7, 2), datetime.datetime(2017, 7, 8))

【问题讨论】:

    标签: python


    【解决方案1】:

    你做错了,只是复制上面的代码而不看你正在使用的库的文档(链接:http://dateutil.readthedocs.io/en/stable/relativedelta.html

    你需要做这样的事情(未经测试):

    from dateutil.relativedelta import *
    
    def get_period_day_range(date, period='month'):
        if period == 'month':
            # Then we want day 1 of that month and previous day of the 
            # day 1 of the next month, hence months = 1 (next month) and
            # days = -1 (previous date)
            first_day = date + relativedelta(day=1)
            last_day = date + relativedelta(day=1, months=1, days=-1)
        elif period == 'week':
            # Last monday
            first_day = date + relativedelta(weekday=MO(-1))
            # Next sunday
            last_day = date + relativedelta(weekday=SU)
        elif period == 'year':
            # First day of the year, note day and month are singular so they
            # are not relative terms (read the doc)
            first_day = date + relativedelta(day=1, month=1)
            # Last day is always 31 December
            last_day = date + relativedelta(day=31, month=12)
        return first_day, last_day
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2020-11-05
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多