如何用Python设置月度工作周起始日期并处理时间序列数据
Python实现自定义工作周到日期的转换及工作日周频率获取
核心思路
要把「week N」格式的字段转成可识别的时间序列,核心是先定位每个月份的第一个工作日,再根据周数推算对应日期;工作日周频率可通过生成间隔7天的工作日序列来实现。
代码实现
1. 导入依赖库
import pandas as pd from datetime import datetime from pandas.tseries.offsets import CustomBusinessDay
2. 获取指定月份的第一个工作日
默认排除周末,如需处理节假日可自定义规则:
def get_first_workday(year, month, holidays=None): # 构造当月第一天 first_day = datetime(year, month, 1) # 定义工作日规则:默认排除周末,传入holidays参数可额外排除指定节假日 bd_rule = CustomBusinessDay(holidays=holidays) if holidays else CustomBusinessDay() # 计算第一个工作日 first_workday = first_day + bd_rule(0) return first_workday
3. 转换「week N」字符串为对应日期
def convert_week_to_date(week_str, year, month, holidays=None): # 从"week N"中提取周数 week_num = int(week_str.split()[1]) # 获取当月第一个工作日 first_workday = get_first_workday(year, month, holidays) # 计算目标日期:第一个工作日 + (周数-1)*7天 target_date = first_workday + pd.Timedelta(days=(week_num - 1)*7) # 转为MM/DD/YYYY格式 return target_date.strftime("%m/%d/%Y")
4. 批量处理数据库数据
假设你的数据存储在DataFrame中,包含week_col(「week N」字段)、year、month三列:
# 模拟数据库数据 df = pd.DataFrame({ "week_col": ["week 1", "week 2", "week 3", "week 4"], "year": [2024]*4, "month": [6]*4 }) # 批量转换日期列 df["converted_date"] = df.apply( lambda row: convert_week_to_date(row["week_col"], row["year"], row["month"]), axis=1 ) print(df) # 输出结果: # week_col year month converted_date # 0 week 1 2024 6 06/03/2024 # 1 week 2 2024 6 06/10/2024 # 2 week 3 2024 6 06/17/2024 # 3 week 4 2024 6 06/24/2024
5. 生成工作日周频率序列
如果需要直接获取某月份所有工作周的起始日期:
def get_workweek_dates(year, month, week_count=4, holidays=None): first_workday = get_first_workday(year, month, holidays) # 生成间隔7天的工作日序列 workweek_dates = pd.date_range(start=first_workday, periods=week_count, freq="7D") # 转为指定格式 return [date.strftime("%m/%d/%Y") for date in workweek_dates] # 示例:获取2024年6月的4个工作周日期 print(get_workweek_dates(2024, 6)) # 输出: ['06/03/2024', '06/10/2024', '06/17/2024', '06/24/2024']
扩展说明
- 若需处理节假日,只需在调用函数时传入
holidays参数(格式为[datetime(2024,6,14), ...]),函数会自动跳过这些日期; - 若数据库中没有单独的
year和month列,可根据数据存储逻辑补充年月信息(比如批量数据对应固定年月,直接传入即可)。
内容的提问来源于stack exchange,提问作者User8563
相关产品推荐
相关产品推荐

