如何通过星期、月份和年份在Python中获取实际日期
在Python中用星期、月份、年份生成实际日期
首先明确两个关键前提:
- 你的星期数据格式:是星期名称(如
"Monday"/"周一")还是数字标识(注意:datetime模块中weekday()返回0=周一、6=周日;isoweekday()返回1=周一、7=周日,需对应你的数据标准) - 你要的是该年月中第一个匹配该星期的日期,还是所有符合条件的日期?
场景1:处理单条数据(用datetime模块)
方法1:获取当月所有匹配日期
适用于需要找出该年月内所有对应星期的日期:
import datetime year = 2024 month = 5 target_weekday = "Monday" # 替换为你的星期数据,也可以直接用数字 # 星期名称转数字(根据你的数据格式调整映射) weekday_map = { "Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, "Friday": 4, "Saturday": 5, "Sunday": 6 } target_num = weekday_map.get(target_weekday, target_weekday) # 获取当月第一天和最后一天 first_day = datetime.date(year, month, 1) last_day = datetime.date(year, month+1, 1) - datetime.timedelta(days=1) if month !=12 else datetime.date(year+1,1,1)-datetime.timedelta(days=1) # 遍历匹配所有目标日期 matched_dates = [] current_day = first_day while current_day <= last_day: if current_day.weekday() == target_num: matched_dates.append(current_day) current_day += datetime.timedelta(days=1) print(f"{year}年{month}月的所有{target_weekday}:{matched_dates}")
方法2:快速获取第一个匹配日期
无需遍历,直接计算偏移量得到当月第一个目标星期的日期:
import datetime year = 2024 month = 5 target_weekday = 0 # 对应周一(datetime.weekday()标准) first_day = datetime.date(year, month, 1) # 计算需要偏移的天数 offset = (target_weekday - first_day.weekday()) % 7 first_matched_date = first_day + datetime.timedelta(days=offset) print(f"{year}年{month}月第一个周一:{first_matched_date}")
场景2:处理批量表格数据(用pandas)
如果你的数据是DataFrame格式的三列(year/month/weekday),可以批量生成日期:
import pandas as pd import datetime # 示例数据 df = pd.DataFrame({ "year": [2024, 2024], "month": [5, 6], "weekday": ["Monday", "Friday"] }) # 映射星期名称到数字 weekday_map = {"Monday":0, "Tuesday":1, "Wednesday":2, "Thursday":3, "Friday":4, "Saturday":5, "Sunday":6} df["weekday_num"] = df["weekday"].map(weekday_map) # 定义函数计算当月第一个匹配日期 def get_first_matched(row): first_day = datetime.date(row["year"], row["month"], 1) offset = (row["weekday_num"] - first_day.weekday()) % 7 return first_day + datetime.timedelta(days=offset) # 批量生成日期列 df["first_matched_date"] = df.apply(get_first_matched, axis=1) print(df)
注意:如果你的星期数字遵循ISO标准(1=周一、7=周日),只需把代码中的
weekday()替换为isoweekday(),并调整映射表即可。
内容的提问来源于stack exchange,提问作者andyolivers
相关产品推荐
相关产品推荐

