car_li_cheng_day_missing.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. """睿行车辆行驶里程日统计缺失数据日期
  2. """
  3. import calendar # 提供处理日历的功能,如获取某月的最后一天
  4. from datetime import datetime, timedelta # 处理日期和时间
  5. from dateutil.relativedelta import relativedelta # 提供相对时间计算功能
  6. from loguru import logger # 日志记录工具
  7. import pandas as pd # 数据分析和处理库
  8. import psycopg # PostgreSQL数据库连接库
  9. # 定义一个函数,用于获取指定日期所在月份的最后一天
  10. def get_last_day_of_month(t):
  11. _, last_day = calendar.monthrange(t.year, t.month) # 获取指定年月的最后一天
  12. return datetime(t.year, t.month, last_day) # 返回该月最后一天的日期对象
  13. # 获取当前日期
  14. today = datetime.today()
  15. # 计算上个月的第一天(即 start_date)
  16. start_date = today - relativedelta(months=1, day=1)
  17. # 获取上个月的最后一天(即 end_date)
  18. end_date = get_last_day_of_month(start_date)
  19. # 初始化一个空列表,用于存储查询结果
  20. a = []
  21. # 使用 psycopg 连接 PostgreSQL 数据库
  22. with psycopg.connect(
  23. conninfo="host='172.16.107.5' port=5432 user='finance' password='Finance@unicom23' dbname='financialdb'",
  24. row_factory=psycopg.rows.dict_row # 指定返回结果为字典格式
  25. ) as conn:
  26. with conn.cursor() as curs: # 创建游标对象
  27. # 构建 SQL 查询语句
  28. sql = f"""
  29. with
  30. t1 as (
  31. -- 生成从 start_date 到 end_date 的每一天日期序列
  32. select generate_series('{start_date.strftime('%Y-%m-%d')}'::date, '{end_date.strftime('%Y-%m-%d')}'::date, '1 day'::interval)::date as data_date
  33. ),
  34. t2 as (
  35. -- 从 car_li_cheng_day 表中提取指定月份的所有唯一日期
  36. select distinct data_date
  37. from car.car_li_cheng_day
  38. where year_month = {start_date.strftime('%Y%m')}
  39. order by data_date
  40. )
  41. -- 查询在 t1 中存在但在 t2 中不存在的日期(即缺失的日期)
  42. select *
  43. from t1
  44. where not exists (select 1 from t2 where t2.data_date = t1.data_date)
  45. """
  46. # 打印 SQL 查询语句以便调试
  47. logger.info(f"sql: {sql}")
  48. # 执行 SQL 查询
  49. curs.execute(sql)
  50. # 获取查询结果
  51. list = curs.fetchall()
  52. # 遍历查询结果,将缺失日期添加到列表 a 中
  53. for x in list:
  54. a.append(x.get('data_date'))
  55. # 将缺失日期列表转换为 Pandas DataFrame
  56. df = pd.DataFrame(a)
  57. # 打印 DataFrame 的基本信息(如列名、数据类型等)
  58. print(df.info())
  59. # 将缺失日期保存到 Excel 文件中
  60. df.to_excel(
  61. f"{start_date.strftime('%Y%m')}睿行车辆行驶里程日统计缺失数据日期.xlsx", # 文件名包含月份信息
  62. index=False, # 不保存索引
  63. header=False # 不保存表头
  64. )