如何在SQL中实现年周格式字符串到年-月-日日期的转换
年周值转datetime对象的实现方法
Python内置的datetime模块就可以直接实现这个需求,核心是用strptime函数搭配对应的周格式符即可,性能远高于自己写逻辑计算。
基础实现(匹配你给出的示例)
你给出的2018-03转2018-01-21符合ISO周规则(周一为一周第一天,每年第一个含周四的周为第1周),示例中取的是每周最后一天(周日),实现代码如下:
from datetime import datetime def year_week_to_date(year_week: str, target_weekday: int = 7) -> datetime.date: """ :param year_week: 年周字符串,格式为"YYYY-WW" :param target_weekday: 要返回的周内日期,ISO规则1=周一,7=周日,默认返回周日 """ year, week = map(int, year_week.split("-")) return datetime.strptime(f"{year}-{week}-{target_weekday}", "%G-%V-%u").date() # 测试你的示例 print(year_week_to_date("2018-03")) # 输出:2018-01-21
如果你需要取每周第一天,把target_weekday改为1即可,2018-03对应的周一是2018-01-15。
不同周规则的适配
如果你的业务用的是周日为一周第一天的规则(常见于北美地区业务),换用对应的格式符即可:
def year_week_to_date_us(year_week: str, target_weekday: int = 0) -> datetime.date: """ :param target_weekday: 周内日期,规则0=周日,6=周六,默认返回周日(每周第一天) """ year, week = map(int, year_week.split("-")) return datetime.strptime(f"{year}-{week}-{target_weekday}", "%Y-%U-%w").date()
批量处理方案
如果有大量年周值需要转换,用pandas的to_datetime效率更高:
import pandas as pd year_week_list = ["2018-03", "2018-04", "2018-05"] # 统一补全要取的周内日期,这里还是取周日,所以加"-7" date_series = pd.to_datetime([f"{yw}-7" for yw in year_week_list], format="%G-%V-%u")
注意事项
- 周数规则没有统一标准,正式使用前一定要用已知结果的测试用例验证格式符是否匹配你的业务规则
- 跨年周的场景一定要用
%G(ISO周对应年份)而不是%Y(日历年),避免出现解析错误
内容的提问来源于stack exchange,提问作者boba
相关产品推荐
相关产品推荐

