一个Python计算时间的脚本(某月第一天最后一天/上周第一天最后一天等)

因为之前的自动化的工作中几乎每个脚本都要在时间节点运行,比如每周的第一天,每月第一天和最后一天等等。这就要涉及到时间的计算,但是没有现成的包,只能自己写一个(╯‵□′)╯︵┻━┻。

用例

这个脚本里包含了一般自动化报表会用到的时间节点。

时间节点 函数方法
今天(struct_time格式) today(today_s)
昨天 yesterday
n月前/后是几月 month()
n月前/后月的第一天 month_start()
n月前/后月的最后一天 month_end()
上周第一天 last_week_start()
上周最后一天 last_week_end()
本周是今年第几周 weeknum
今天是本周第几天 wday
今天是本月第几天 mday
今天是本年第几天 yday
本月天数 mranges
day = Sometime(timestr="2019-04-25") # 指定基准日期
print(day.today)
print(day.yesterday)
print(day.month(n_mon=2))   # 2个月后是几月
print(day.month_start(n_mon=5)) # 5个月后当月的第一天
print(day.month_end(n_mon=-6))  # 6个月前的当月第一天
print(day.last_week_start())
print(day.last_week_end())
print(day.today_s)
2019-04-25 00:00:00
2019-04-24
6
2019-09-01
2018-10-31
2019-04-15
2019-04-21
time.struct_time(tm_year=2019, tm_mon=4, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=115, tm_isdst=-1)
day1 = Sometime(n=2)  # 利用n来指定日期,正数是未来,负数是过去
print(day1.today)
print(day1.year)
print(day1.yday)
print(day1.mday)
print(day1.wday)
print(day1.weeknum)
print(day1.mranges)
2019-04-28
2019
118
28
6
17
30

源码

import time
import datetime
import calendar


class Sometime:
    def __init__(self, timestr=None, n=None):
        """
        自定义起始日期,然后从起始日期计算:
        当天日期,昨天日期,
        上月开始结束日期,上周开始结束日期,
        本周是今年第几周,今天是本周第几天
        参数设定:
        按照"2019-01-01"的格式填写
        n: int,n=0 等于今天,
            - n < 0 时,1等于昨天,2等于前天,以此类推
            - n > 0 时,-1等于明天,-2等于后天,以此类推
        **两个参数不能同时存在!!!**
        """
        if timestr is None:
            if n is None:
                time_str = datetime.date.today()
            else:
                time_str = (datetime.date.today() - datetime.timedelta(days=-n))
        else:
            if n is None:
                time_str = datetime.datetime.strptime(timestr, "%Y-%m-%d")
            else:
                time_str = datetime.datetime.strptime(timestr, "%Y-%m-%d")
                print("参数timestr和n不能同时使用!!!,否则默认使用timestr参数")

        self.today = time_str
        self.today_s = time_str.timetuple()  # 输出今天的struct_time格式
        self.yesterday = (self.today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
        self.year = self.today_s.tm_year    # 今年年份
        self.mday = self.today_s.tm_mday    # 今天是本月第几天
        self.yday = self.today_s.tm_yday    # 今天是今年第几天
        self.wday = self.today_s.tm_wday    # 今天是本周第几天
        self.weeknum = self.today.isocalendar()[1]    # 今周是今年第几周
        self.mranges = calendar.monthrange(self.today_s.tm_year, 
                                            self.today_s.tm_mon)[1]    # 本月天数

    def month(self, n_mon=0):
        """
        计算:
        n月前(当n是负数时)或
        n月后(当n是正数时)是几月份
        **默认n=0返回当前月份**
        """
        k = (self.today_s.tm_mon + n_mon) % 12
        if n_mon == 0:
            result = self.today_s.tm_mon
        else:
            result = 12 if k == 0 else k
        return result

    def month_start(self, n_mon=0):
        """
        计算:
        n月前(当n是负数时)或
        n月后(当n是正数时)的月份的第一天
        **默认n=0返回当前月份第一天**
        """
        month_l = self.month(n_mon=n_mon)
        y = (self.today_s.tm_mon + n_mon) / 12
        y1 = (self.today_s.tm_mon + n_mon) // 12
        if y > 0:
            if month_l == 12:   # 当月份为12月份时年份提前+1的情况
                year_l = self.year + y1 - 1
            else:
                year_l = self.year if y1 == 0 else self.year + y1
        else:
            year_l = self.year -1 if y1 == 0 else self.year + y1
        result = datetime.date(
            year=year_l,
            month=month_l,
            day=1).strftime('%Y-%m-%d')
        return result

    def month_end(self,n_mon=0):
        """
        计算:
        n月前(当n是负数时)或
        n月后(当n是正数时)的月份的最后一天
        **默认n=0返回当前月份最后一天**
        """
        month_l = self.month(n_mon=n_mon)
        y = (self.today_s.tm_mon + n_mon) / 12
        y1 = (self.today_s.tm_mon + n_mon) // 12
        if y > 0:
            if month_l == 12:   # 当月份为12月份时年份提前+1的情况
                year_l = self.year + y1 -1 
            else:
                year_l = self.year if y1==0 else self.year + y1
        else:
            year_l = self.year -1 if y1 == 0 else self.year + y1
        mrange = calendar.monthrange(year_l, month_l)[1]
        result = datetime.date(
            year=year_l,
            month=month_l,
            day=mrange).strftime('%Y-%m-%d')
        return result    

    def last_week_start(self):
        """返回上周第一天"""
        result = (
            self.today -
            datetime.timedelta(
                days=self.today.weekday() +
                7)).strftime("%Y-%m-%d")
        return result

    def last_week_end(self):
        """返回上周最后一天"""
        result = (
            self.today -
            datetime.timedelta(
                days=self.today.weekday() +
                1)).strftime("%Y-%m-%d")
        return result

通过两种指定“今天”的方式,可以计算出以任意一天为基点的相关日期。非常方便。
如果你在使用过程中有什么问题,可以联系我。

你可能感兴趣的:(python学习笔记,数据分析)