• Python脚本2 打印文本内两个日期之间的所有小时


    1. 需求描述


    1、 从文件中读取两个日期,一个起始日期,一个终止日期,例如
    2、 生成这两个日期间所有以小时为间隔的时间点,并写入文件中

    2. 代码实现


    2.1 思路

    经过一番搜索,最后得出可以使用 python3 内置的 datetime 模块记录时间, 这个类里面记录了日期的各个指标,比如年份、月份、日、小时、秒、毫秒都有,不仅如此,该模块提供的 datetime 对象还支持加减运算。不过它不支持输出时间戳,故时间戳需要使用 time模块。

    使用 python3 内置的 timedelta 模块来计算不同时间的差值,比如 :计算三天后的日期

    now = datetime.now()
    
    threeDays = now + timedelta(days=3)
    
    • 1
    • 2
    • 3

    根据需求描述,每个月的最后一天16:00 后的时间都要归于下一个月,通过使用 datetime 、timedelta这两个模块很容易实现,只需要考虑以下几个问题即可:

    1. 将类似于2022-08-24 的文本转化为 datetime 型的对象

    通过 datetime.的 strptime 方法实现,不过需要指定时间表达式,例如 %Y-%m-%d

    1. 判断当前时间的天是否为本月的最后一天

    当前的时间加一天,看看是否加一天后的 datetime 的月份是否和之前的相同,如果不同则说明是本月的最后一天。

    1. 判断当前时间是否超过16:00

    通过访问 datetime 内置的 hour 对象就可以获取到 int 型的小时

    2.3 代码实现

    脚本基本的代码实现:从最简单的方式出发,不考虑脚本的参数,先实现其功能。

    import time
    from datetime import date, timedelta, datetime
    
    """ ---------------------------------------|
      功能函数 
    -----------------------------------------"""
    # 1. 获取下一天
    def nextDay(now: datetime) -> datetime:
        return now + timedelta(days=1)
    
    # 2. 判断是否为当月的最后一天
    def isLastDayInMonth(now: datetime) -> bool:
        tomorrow = nextDay(now)
        return now.month != tomorrow.month
    
    # 3. 判断时间是否超过 16:00
    def isPasHourThan16(now: datetime) -> bool:
        return now.hour > 16
    
    
    """ --------------------------------------------------|
      读取文件                                             
    ----------------------------------------------------"""
    with open('test.txt') as fp:
        params = {
       }
        for line in fp.readlines():
            # 去掉空格和换行符
            line = line.replace(' ', '').replace('\n', '')
            # 将参数放入字典
            k, v = line.split('=')
            params[k] = datetime.strptime(v, "%Y-%m-%d")
        print(params)
    
    
    start_time = params['Start']
    end_time = params['End']
    ym_set = set()  # 表示年月
    
    while start_time < end_time:
        ym = None  # 当前的年月
        # 特殊处理: 每个月最后一天 16:00 之后的时间点需打印在下一个月
        if isLastDayInMonth(start_time) and isPasHourThan16(start_time):
            ym = nextDay(start_time).strftime('%Y_%m')
        else:
            ym = start_time.strftime('%Y_%m')
        # 若年月未出现过则打印
        if ym not in ym_set:
            print(ym)
            ym_set.add(ym)
        print('  ', start_time)
        # 遍历下一个小时
        start_time += timedelta(hours=1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    测试文本:

    Start = 2020-01-01
    End = 2021-01-01
    
    • 1
    • 2

    代码优化:
    以上的代码能实现基本功能,但是还需要读代码的内容,修改源代码才能满足需求,现在将代码进行优化,使得可以直接通过命令行来实现需求指定的功能:
    main.py

    
                    
  • 相关阅读:
    Android 运营商与APN配置简介
    【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法
    数据的加解密
    如何修复epic中的 EasyAntiCheat
    linux shell 编程之变量总结
    常用概念-分布式系统
    【LeetCode高频SQL50题-基础版】打卡第8天:第41~45题
    SpringBoot微服务的发布与部署(3种方式)
    政安晨:【Keras机器学习示例演绎】(七)—— 利用 NeRF 进行 3D 体积渲染
    一文带你搞定抖音最近最火的情侣微信早报信息推送
  • 原文地址:https://blog.csdn.net/Unirithe/article/details/126508633