car_yue_jie_missing.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """睿行车辆越界报警日统计缺失数据日期
  2. """
  3. import calendar # 导入日历模块,用于处理日期相关操作
  4. from datetime import datetime # 导入日期时间模块,用于处理日期和时间
  5. import pandas as pd # 导入pandas库,用于数据处理与分析
  6. import psycopg # 导入psycopg库,用于连接PostgreSQL数据库
  7. from dateutil.relativedelta import relativedelta # 导入relativedelta模块,用于日期的相对计算
  8. from loguru import logger # 导入loguru库,用于日志记录
  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. # 计算上一个月的第一天
  16. start_date = today - relativedelta(months=1, day=1)
  17. # 计算上一个月的最后一天
  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: # 创建游标对象,用于执行SQL语句
  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.car_yue_jie表中提取指定年月的所有唯一日期
  36. select distinct data_date
  37. from car.car_yue_jie
  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. # 遍历查询结果,将data_date字段的值添加到列表a中
  53. for x in list:
  54. a.append(x.get('data_date'))
  55. # 将列表a转换为pandas DataFrame
  56. df = pd.DataFrame(a)
  57. # 打印DataFrame的基本信息,便于调试
  58. print(df.info())
  59. # 将DataFrame保存为Excel文件,文件名为“睿行车辆越界报警日统计缺失数据日期.xlsx”
  60. df.to_excel(
  61. f"{start_date.strftime('%Y%m')}睿行车辆越界报警日统计缺失数据日期.xlsx",
  62. index=False, # 不保存索引
  63. header=False # 不保存列名
  64. )