月末与周末数据拉取逻辑咨询:周末取前工作日数据
实现月末/非周末数据拉取(周末自动回退至前一个工作日)
需求要点
- 目标日期为月末日期时,直接拉取对应数据
- 目标日期为非周末工作日时,直接拉取对应数据
- 目标日期为**周末(周六/周日)**时,自动回退至最近的前一个工作日并拉取数据
Python 实现方案
借助pandas的工作日偏移工具可以高效处理日期回退,同时兼顾月末校验:
from pandas.tseries.offsets import BusinessDay import datetime def get_target_date(input_date): # 处理周末回退 if input_date.weekday() in (5, 6): # 5=周六,6=周日 target_date = input_date - BusinessDay(1) else: target_date = input_date # 月末校验(确保月末日期被正确保留) next_day = target_date + datetime.timedelta(days=1) if next_day.month != target_date.month or next_day.day == 1: return target_date return target_date # 测试用例 test_dates = [ datetime.date(2022, 8, 20), # 周六 datetime.date(2022, 8, 21), # 周日 datetime.date(2023, 8, 31), # 月末周四 datetime.date(2023, 9, 30), # 月末周六 ] for date in test_dates: result = get_target_date(date) print(f"输入: {date.strftime('%Y-%m-%d')} → 目标: {result.strftime('%Y-%m-%d')}")
说明:
BusinessDay(1)会自动跳过周末和法定节假日,如需自定义节假日可传入holidays参数- 月末判断逻辑确保即使月末为周末,回退后的工作日仍被正确识别
MySQL 实现方案
用原生SQL函数实现日期判断与回退:
DELIMITER // CREATE FUNCTION get_target_date(input_date DATE) RETURNS DATE BEGIN DECLARE target_date DATE; -- 判断周末(DAYOFWEEK:周日=1,周六=7) IF DAYOFWEEK(input_date) IN (1, 7) THEN SET target_date = input_date - INTERVAL 1 DAY; -- 循环回退直到找到工作日 WHILE DAYOFWEEK(target_date) IN (1, 7) DO SET target_date = target_date - INTERVAL 1 DAY; END WHILE; ELSE SET target_date = input_date; END IF; -- 校验月末 IF DAY(target_date + INTERVAL 1 DAY) = 1 THEN RETURN target_date; END IF; RETURN target_date; END // DELIMITER ; -- 调用示例 SELECT get_target_date('2022-08-20') AS target_date; -- 返回2022-08-19 SELECT get_target_date('2023-09-30') AS target_date; -- 返回2023-09-29
说明:
- 若需处理法定节假日,可关联自定义节假日表,在循环中额外判断排除
内容的提问来源于stack exchange,提问作者BEESU CHANDU
相关产品推荐
相关产品推荐

