常用小记

时间日期相关

# 格式化时间戳 
time.strftime("%Y-%m-%d", time.localtime( time.time() ))
%y 两位数的年份表示(00-99
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%p 本地A.M.或P.M.的等价符
%M 分钟数(00=59)
%S 秒(00-59)
%w 星期(0-6),星期天为星期的开始
%j 年内的一天(001-366)
%U 一年中的星期数(00-53)星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示(10/13/21)
%X 本地相应的时间表示(14:00:46)

# 用时间戳获取日期相关数据(localtime)
time.localtime(time.time()).tm_year ==>	2021	# 年
time.localtime(time.time()).tm_mon	==>	10		# 月
time.localtime(time.time()).tm_mday	==>	13		# 当月几号
time.localtime(time.time()).tm_hour	==>	13		# 小时
time.localtime(time.time()).tm_min	==>	28		# 分钟
time.localtime(time.time()).tm_sec	==>	40		# 秒
time.localtime(time.time()).tm_wday	==>	2		# 星期(0~6 0是周一)
time.localtime(time.time()).tm_yday	==>	286		# 今年第几天

# 获取年份时间戳
datetime.datetime.strptime("2021", "%Y").timestamp()
# 获取月份时间戳
datetime.datetime.strptime("2021-1", "%Y-%m").timestamp()

# 获取月份相关信息
from calendar import monthrange
monthrange(2021, 10)	# monthrange(年, 月)
==>	(4, 31)
## 第一个值为月份开始的星期(0~6 0是周一)
## 第二个值为月份最后一天的日(相当于月总天数)

# 用时间戳获取年、月开始时间
datetime.datetime.strptime(time.strftime("%Y-%m", time.localtime(time.time())), "%Y-%m").timestamp()  ==>  1609430400
datetime.datetime.strptime(time.strftime("%Y-%m", time.localtime(time.time())), "%Y-%m").timestamp()  ==>  1633017600

# 当天始末时间戳快速计算
SECONDS_PER_DAY = 86400
start_time = timestamp // SECONDS_PER_DAY * SECONDS_PER_DAY
end_time = start_time + SECONDS_PER_DAY - 1

时间分割方法

from dateutil.relativedelta import relativedelta
from datetime import datetime


def date_selection(start_date, end_date, fdstr="%Y-%m-%d", interval=1, mode=""):
    """
    时间分割方法
    :param start_date: 开始时间/日期
    :param end_date: 结束时间/日期
    :param fdstr: 时间格式字符串
    :param interval: 时间间隔单位
    :param mode: "YOY" 返回同比时间  "QOQ" 返回环比时间
    :return:
        [
            {
                "date": "2025-09-01",
                "_date": "2025-09-01",
                "start_dt": "2025-09-01",  # 开始日期
                "end_dt": "2025-09-07",  # 结束日期
                "start_ts": 1756656000,  # 开始时间戳
                "end_ts": 1757260799  # 结束时间戳
            },
            ...
        ]
    """
    # 整理开始结束时间
    if not isinstance(start_date, str) or start_date.isdecimal():
        start_date = datetime.strptime(start_date, fdstr).timestamp()
    if not isinstance(end_date, str) or end_date.isdecimal():
        end_date = datetime.strptime(end_date, fdstr).timestamp()
    current = datetime.strptime(start_date, fdstr)
    end_dt = datetime.strptime(end_date, fdstr)

    # 处理时间分割单位
    interval_type = {
        "%y": {"years": interval},
        "%Y": {"years": interval},
        "%m": {"months": interval},
        "%d": {"days": interval},
        "%H": {"hours": interval},
        "%I": {"hours": interval},
        "%M": {"months": interval},
        "%S": {"seconds": interval},
    }
    _relativedelta = relativedelta(**interval_type[fdstr[-2:]])

    # 同环比处理
    _dt = None
    if mode == "YOY":
        _dt = relativedelta(years=1)
        current -= _dt
        end_dt -= _dt
    if mode == "QOQ":
        _dt = end_dt - current
        current -= _dt
        end_dt -= _dt
    result = []

    # 处理数据
    while current <= end_dt:
        next = current + _relativedelta
        start_ts = int(current.timestamp())
        end_ts = int((next - relativedelta(seconds=1)).timestamp())
        _current = current
        if _dt:
            _current = current + _dt
        result.append({
            "date": current.strftime(fdstr), "_date": _current.strftime(fdstr),
            "start_dt": current.strftime(fdstr), "end_dt": (next - relativedelta(seconds=1)).strftime(fdstr),
            "start_ts": start_ts, "end_ts": end_ts,
        })
        current = next

    return result


date = date_selection("2025-9-1", "2025-9-30", fdstr="%Y-%m-%d", interval=7)
import json

print(json.dumps(date, indent=4))

运行系统命令

# 运行系统命令
import os
os.system('ping www.baidu.com')

# 无打印运行运行系统命令
import subprocess
subprocess.getstatusoutput('ping www.baidu.com')
==>
(返回状态, 返回结果)

列表有序去重

from functools import reduce
reduce(lambda x, y: x if y in x else x + [y], [[], ] + list())

生成随机码

def random_code(num=4, has_lower=True, has_upper=True, has_number=True):
    """num=位数,has_lower=包含小写字母,has_upper=包含大写字母,has_number=包含数字"""

    def value():
        choice_values = []
        if has_number: choice_values.append(random.randint(0, 9))
        if has_upper: choice_values.append(chr(random.randint(65, 90)))
        if has_lower: choice_values.append(chr(random.randint(97, 122)))
        return random.choice(choice_values)

    return ''.join(str(value()) for i in range(num))

列表嵌套解压

flat_list = [item for sublist in nested_list for item in sublist]

定时器脚本

import time, threading, schedule, functools, traceback


# 异常捕获
def catch_exceptions(cancel_on_failure=False):
    def catch_exceptions_decorator(job_func):
        @functools.wraps(job_func)
        def wrapper(*args, **kwargs):
            try:
                return job_func(*args, **kwargs)
            except:
                traceback.print_exc()
                if cancel_on_failure:
                    return schedule.CancelJob  # 取消任务

        return wrapper

    return catch_exceptions_decorator


# 异步启动
@catch_exceptions(cancel_on_failure=False)
def run_threaded(job_func, *args, **kwargs):
    job_thread = threading.Thread(target=job_func, args=args, kwargs=kwargs)
    job_thread.start()


def job(name="1"):
    print(f"{time.time().__int__()} 定时任务{name}正在执行...")


schedule.every().seconds.do(run_threaded, job)  # 每秒运行一次
schedule.every(2).seconds.do(run_threaded, job, 2)  # 每2秒运行一次
schedule.every(1).to(5).seconds.do(run_threaded, job, name="1-5")  # 每1-5秒运行一次
schedule.every(2).minutes.do(run_threaded, job, "每两分钟")  # 每2分钟运行一次
schedule.every().hour.at(':30').do(run_threaded, job, "每小时30分").tag('hourly-tasks', '设置标签')  # 每小时30分
schedule.every().day.at("10:30").do(run_threaded, job).tag('daily-tasks', '设置标签')  # 每天的10:30执行任务

# get_jobs(标签):可以获取所有该标签的任务
hourly_tasks = schedule.get_jobs('hourly-tasks')
# 取消所有 daily-tasks 标签的任务
schedule.clear('daily-tasks')
while True:
    schedule.run_pending()
    time.sleep(1)

# schedule.clear()  # 立即清除当前程序的所有作业

异步调用

import anyio


async def some_task(delay):
    print(f"延迟 {delay} 秒的任务开始")
    await anyio.sleep(delay)
    print(f"延迟 {delay} 秒的任务完成")


async def main():
    async with anyio.create_task_group() as tg:
        tg.start_soon(some_task, 1)
        tg.start_soon(some_task, 2)


anyio.run(main)

posted @ 2021-10-13 15:24  最冷不过冬夜  阅读(66)  评论(0)    收藏  举报