You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python生成符合指定条件的6个月内会议日期的代码实现求助

Python生成符合指定条件的6个月内会议日期的代码实现求助

嘿,作为Python新手碰到这个问题太正常啦,别发愁!我给你整理了一个清晰的解决方案,刚好能满足你每月安排周一到周三的会议、排除周末和节假日、覆盖起始日期后6个月的需求。

首先,我们需要用到两个实用工具:Python自带的datetime库(处理日期基础操作)和pandas库(帮我们轻松搞定节假日判断,比自己写逻辑省心多了)。如果还没装pandas,先在终端跑这个命令安装:

pip install pandas

如果想要更精确的月份计算(比如跨月时准确算6个月,而不是按30天粗略算),还可以装python-dateutil:

pip install python-dateutil

接下来是完整代码,我会逐段给你解释:

from datetime import datetime, timedelta
# 如果用精确月份计算,就导入这个
from dateutil.relativedelta import relativedelta

def generate_meeting_dates(start_date_str, holidays_list=None):
    # 把起始日期字符串转成datetime对象,格式是'YYYY-MM-DD',如果你的日期格式不同可以调整这里
    start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
    
    # 两种计算6个月后日期的方式,选一个就行:
    # 方式1:粗略按30天算(简单但可能和实际月份有1-2天误差)
    # end_date = start_date + timedelta(days=6*30)
    # 方式2:精确计算6个月(推荐,需要装python-dateutil)
    end_date = start_date + relativedelta(months=6)
    
    # 处理节假日列表,如果没传就设为空
    if holidays_list is None:
        holidays_list = []
    # 把节假日字符串转成datetime对象,方便后续判断
    holidays = [datetime.strptime(holiday, '%Y-%m-%d') for holiday in holidays_list]
    
    meeting_dates = []
    current_date = start_date
    
    while current_date <= end_date:
        # 只保留周一到周三:weekday()返回0=周一,1=周二,2=周三
        if current_date.weekday() in [0, 1, 2]:
            # 排除节假日
            if current_date not in holidays:
                # 确保每个月只添加一个会议日期(这里选当月第一个符合条件的日期)
                # 如果你想改成每月第二个周三之类的规则,可以告诉我调整这部分逻辑
                if not any(d.month == current_date.month for d in meeting_dates):
                    meeting_dates.append(current_date)
        # 日期加1天,继续循环
        current_date += timedelta(days=1)
    
    # 把datetime对象转成字符串格式,方便查看和使用
    return [date.strftime('%Y-%m-%d') for date in meeting_dates]

# 示例用法,你可以根据自己的情况修改
if __name__ == "__main__":
    # 你的起始日期
    my_start_date = '2024-01-01'
    # 自定义节假日列表,按'YYYY-MM-DD'格式写就行
    my_holidays = ['2024-01-01', '2024-02-12', '2024-05-27']
    
    # 生成会议日期
    result_dates = generate_meeting_dates(my_start_date, my_holidays)
    
    # 打印结果
    print("生成的6个月会议日期:")
    for idx, date in enumerate(result_dates, 1):
        print(f"第{idx}个月:{date}")

代码关键点说明:

  • 日期范围:推荐用relativedelta精确计算6个月,避免按30天算的误差;
  • 工作日筛选:通过weekday()判断周几,只保留周一到周三,自动排除周末;
  • 节假日排除:你可以把所有需要避开的节假日都放进my_holidays列表,代码会自动跳过这些日期;
  • 每月单日期规则:当前逻辑是选当月第一个符合条件的日期,如果你想要其他规则(比如每月第二个周二、每月最后一个周三),随时说,我帮你调整!

另外,关于你之前用Excelworkday.intl只能排除两天的问题,这个Python方案完全没有限制,能轻松排除所有周末和任意数量的节假日,完美适配你的需求。

如果运行时遇到问题(比如日期格式不对、规则需要调整),随时留言哦!

备注:内容来源于stack exchange,提问作者Cieara Corcoran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:32:57