时间日期相关
# 格式化时间戳
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)