"""睿行车辆行驶里程日统计缺失数据日期 """ import calendar # 提供处理日历的功能,如获取某月的最后一天 from datetime import datetime, timedelta # 处理日期和时间 from dateutil.relativedelta import relativedelta # 提供相对时间计算功能 from loguru import logger # 日志记录工具 import pandas as pd # 数据分析和处理库 import psycopg # PostgreSQL数据库连接库 # 定义一个函数,用于获取指定日期所在月份的最后一天 def get_last_day_of_month(t): _, last_day = calendar.monthrange(t.year, t.month) # 获取指定年月的最后一天 return datetime(t.year, t.month, last_day) # 返回该月最后一天的日期对象 # 获取当前日期 today = datetime.today() # 计算上个月的第一天(即 start_date) start_date = today - relativedelta(months=1, day=1) # 获取上个月的最后一天(即 end_date) end_date = get_last_day_of_month(start_date) # 初始化一个空列表,用于存储查询结果 a = [] # 使用 psycopg 连接 PostgreSQL 数据库 with psycopg.connect( conninfo="host='172.16.107.5' port=5432 user='finance' password='Finance@unicom23' dbname='financialdb'", row_factory=psycopg.rows.dict_row # 指定返回结果为字典格式 ) as conn: with conn.cursor() as curs: # 创建游标对象 # 构建 SQL 查询语句 sql = f""" with t1 as ( -- 生成从 start_date 到 end_date 的每一天日期序列 select generate_series('{start_date.strftime('%Y-%m-%d')}'::date, '{end_date.strftime('%Y-%m-%d')}'::date, '1 day'::interval)::date as data_date ), t2 as ( -- 从 car_li_cheng_day 表中提取指定月份的所有唯一日期 select distinct data_date from car.car_li_cheng_day where year_month = {start_date.strftime('%Y%m')} order by data_date ) -- 查询在 t1 中存在但在 t2 中不存在的日期(即缺失的日期) select * from t1 where not exists (select 1 from t2 where t2.data_date = t1.data_date) """ # 打印 SQL 查询语句以便调试 logger.info(f"sql: {sql}") # 执行 SQL 查询 curs.execute(sql) # 获取查询结果 list = curs.fetchall() # 遍历查询结果,将缺失日期添加到列表 a 中 for x in list: a.append(x.get('data_date')) # 将缺失日期列表转换为 Pandas DataFrame df = pd.DataFrame(a) # 打印 DataFrame 的基本信息(如列名、数据类型等) print(df.info()) # 将缺失日期保存到 Excel 文件中 df.to_excel( f"{start_date.strftime('%Y%m')}睿行车辆行驶里程日统计缺失数据日期.xlsx", # 文件名包含月份信息 index=False, # 不保存索引 header=False # 不保存表头 )