python处理时间,按照周分割时间段

在实际的开发中,我们经常要设计一些工具类,对于时间来说,有时候需要将其处理成时间段。

例如,对于2024年08月01日到2024年08月16日的时间段,我们如何将其处理成时间段[2024-08-01, 2024-08-03], [2024-08-04, 2024-08-10], [2024-08-11, 2024-08-16]。如下表所示:

周日 周一 周二 周三 周四 周五 周六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16

这里,我们采用迭代就可以实现,通过计算每个阶段的开始日期和结束日期,先根据当前阶段开始日期计算当周周日的日期,再判断总的结束日期是否在周日前,如果在,则将第一段时间的结束日期确定为总的结束日期。如果在超出了周日,则将周日定为该阶段的结束日期,以此类推。

这里我们用到几个函数
datetime.datetime.strptime:将字符串转为日期对象
datetime.timedelta: 计算当前日期前推或后推后的日期。
datetime.weekday: 计算当前日期是星期几,其中0代表周末,1代表周一,2代表周二,以此类推。

python 复制代码
def split_date_range(start_date_input: str, end_date_input: str) -> list:
    # 将输入的日期字符串转换为日期对象
    start_date = datetime.datetime.strptime(start_date_input, '%Y-%m-%d')
    end_date = datetime.datetime.strptime(end_date_input, '%Y-%m-%d')
    periods = []
    current_date = start_date
    while current_date <= end_date:
        sunday = current_date + datetime.timedelta(days=(6 - current_date.weekday()))
        if sunday <= end_date:
            periods.append((current_date.strftime('%Y-%m-%d'), sunday.strftime('%Y-%m-%d')))
        else:
            periods.append((current_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d')))
            break
        # 更新当前日期为周的结束日期的下一天,以便开始下一个周期
        current_date = sunday + datetime.timedelta(days=1)
    return periods

这样我们就可以推算每一周的时间阶段了

如果我们只要工作日的时间阶段呢?应该如何修改这段程序,可以把周期的结束时间调整为周五的日期,也就是周日往前推2天。

周日 周一 周二 周三 周四 周五 周六
1 2
5 6 7 8 9
12 13 14 15 16

程序如下:

python 复制代码
def split_date_range(start_date_input: str, end_date_input: str) -> list:
    start_date = datetime.datetime.strptime(start_date_input, '%Y-%m-%d')
    end_date = datetime.datetime.strptime(end_date_input, '%Y-%m-%d')
    periods = []
    current_date = start_date
    while current_date <= end_date:
        sunday = current_date + datetime.timedelta(days=(6 - current_date.weekday()))
        friday = current_date + datetime.timedelta(days=(6 - 2 - current_date.weekday()))
        if friday <= end_date:
            periods.append((current_date.strftime('%Y-%m-%d'), friday.strftime('%Y-%m-%d')))
        else:
            periods.append((current_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d')))
            break
        current_date = sunday + datetime.timedelta(days=1)
    return periods

就会自动把周六日的时间去掉,得到的时间就变为了:

相关推荐
怕浪猫7 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
高洁017 小时前
具身智能中的世界模型训练
人工智能·python·深度学习·机器学习·transformer
无线通信科研笔记7 小时前
IEEE TVT 2026 论文精读与完整复现|相位误差如何重塑近场 RIS 的幅相响应
论文阅读·人工智能·python·算法·论文笔记
朝朝辞暮i8 小时前
VLA 系统学习第 1 课:VLA 到底在干什么?
人工智能·python·计算机视觉·vla
2601_962885728 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen9 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
北冥有鱼被烹9 小时前
VCSEL全景解析:与光模块NPO CPO的关系、市场量化分析与产业链影响
python
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong9 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
正在走向自律9 小时前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas