python cookbook 学习笔记 第三章 数字日期和时间(14) 计算当前月份的日期范围

  • 计算当前月份的日期范围
  • 问题:
    • 代码需要在当前月份中循环每一天,找到一个计算日期范围的高效方法
  • 解决方案:
    • 在这样的日期循环需要事先构建一个包含有日期的列表。可以先计算出开始日期和结束日期,然 后在步进的时候使用 datetime.timedelta() 对象递增这个变量即可。
  • 下面是一个接受任意 datetime 对象并返回一个由当前月份开始日和下个月开始日期组成的元 组对象。
from datetime import datetime, date, timedelta
import calendar

def get_month_range(start_date= None):
    if start_date is None:
        start_date = date.today().replace(day= 1)
    _, days_in_month = calendar.monthrange(start_date.year,
                                           start_date.month)
    end_date = start_date + timedelta(days= days_in_month)
    return (start_date, end_date)
  • 有了这个就可以在返回的日期范围上面做循环了:
a_day = timedelta(days= 1)
first_day, last_day = get_month_range()
while first_day < last_day:
    print(first_day)
    first_day += a_day
  • 讨论: 上面的代码先计算出对应月份第一天的日期。一个快速的方法就是使用 date 或 datetime 对象的 replace() 方法简单的将 days 属性设置成 1 即可。所以,如果输入参数是一个实例, 那么结果也是一个 date 实例。同样,如果输入是一个 datetime 实例,那么得到的也是一个datetime 实例。

  • 然后,使用 calendar.monthrange() 函数找出该月的总天数。任何时候,想要获得日历信息, 那么 calendar 模块就非常有用。onthrange() 函数会返回包含星期和改月天数的元组。

  • 一旦该月的天数已知了,那么结束日期就可以通过在开始日期上面加上这个天数获得。需要注意 的是,结束日期并不包含在这个日期范围内(它是下个月的开始日期)。 为了在日期范围上循环,使用到标准的数学和比较操作。比如,可以利用 timedelta 实例来递增 日期,小于号 < 用来检查一个日期是否在结束日期之前。

  • 理想情况下,如果能为日期迭代创建一个同内置的 range() 函数就好了。可以使用一个生成 器来实现:

def date_range(start, stop, step):
    while start < stop:
        yield start
        start += step
  • 下面是使用这个生成器的例子:
for d in date_range(datetime(2018, 11, 24),
                    datetime(2018, 12, 1),
                    timedelta(hours= 24)):
    print(d)
  • Python 中的日期和时间能够使用标准数学和比较操作符来运算,是这些操作的根本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值