如何将月周次+星期数值转换为对应日期,支持bash或python实现
实现方案(Python版)
字段含义说明
先统一你给出的配置项规则:
hour_start: 13:维护开始时间为当日13点minute_duration: 120:维护总时长120分钟(即2小时)week: 3:每月第3周执行维护weekday: 2:每周的第2天(下方代码默认适配周1为1、周2为2的规则,如果你的规则是周日为周1,修改代码里的偏移量即可)
完整可运行代码
import datetime import calendar def get_monthly_maintenance_time(target_year: int, target_month: int, config: dict) -> tuple[datetime.datetime, datetime.datetime]: # 适配周数规则:如果你的weekday是周日为1,把这里的偏移量改成 config['weekday'] % 7 即可 weekday_offset = config['weekday'] - 1 # 转成Python datetime内置规则:周一=0、周二=1...周日=6 # 获取目标月的所有日期排布 month_calendar = calendar.monthcalendar(target_year, target_month) # 匹配第N周的目标星期日期 valid_week_count = 0 target_day = 0 for week in month_calendar: if week[weekday_offset] != 0: # 排除跨月显示的上月日期 valid_week_count += 1 if valid_week_count == config['week']: target_day = week[weekday_offset] break if target_day == 0: raise ValueError(f"{target_year}年{target_month}月不存在第{config['week']}个周{config['weekday']}") # 构造开始、结束时间 start_time = datetime.datetime( year=target_year, month=target_month, day=target_day, hour=config['hour_start'], minute=0 ) end_time = start_time + datetime.timedelta(minutes=config['minute_duration']) return start_time, end_time # 你的维护配置 maintenance_config = { "hour_start": 13, "minute_duration": 120, "week": 3, "weekday": 2 } if __name__ == "__main__": # 固定指定年月运行 year, month = 2024, 10 # 要自动取当前月运行的话,替换上面一行为下面两行即可 # now = datetime.datetime.now() # year, month = now.year, now.month start, end = get_monthly_maintenance_time(year, month, maintenance_config) print(f"维护开始时间:{start.strftime('%Y-%m-%d %H:%M:%S')}") print(f"维护结束时间:{end.strftime('%Y-%m-%d %H:%M:%S')}")
批量处理导出的表格数据
如果你需要批量处理从数据库导出的Excel/CSV格式数据,可以用pandas库完成批量转换,示例代码片段:
import pandas as pd # 读取导出的文件 df = pd.read_excel("导出的维护配置表.xlsx") # 新增两列存储计算后的时间 df['维护开始时间'] = df.apply( lambda row: get_monthly_maintenance_time(row['year'], row['month'], row.to_dict())[0].strftime('%Y-%m-%d %H:%M:%S'), axis=1 ) df['维护结束时间'] = df.apply( lambda row: get_monthly_maintenance_time(row['year'], row['month'], row.to_dict())[1].strftime('%Y-%m-%d %H:%M:%S'), axis=1 ) # 保存结果 df.to_excel("维护时间计算结果.xlsx", index=False)
内容的提问来源于stack exchange,提问作者shkabaan
相关产品推荐
相关产品推荐

