12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- """睿行车辆行驶里程日统计缺失数据日期
- """
- 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 # 不保存表头
- )
|