如何用Python从yyyyww格式列中提取ISO周对应的最后一天日期
实现代码
首先导入依赖:
import pandas as pd import datetime
方法1:使用pandas内置日期格式解析(推荐,pandas 1.1.0+支持)
%G、%V是ISO标准对应的年份、周数格式符,%u对应星期几(1=周一,7=周日),直接拼接周数为7即可获取ISO周的最后一天:
# 替换为你实际的yyyyww格式列名 year_week_col = "你对应的列名" # 先统一转为6位字符串,避免周数前导零缺失的问题 df_mixed[year_week_col] = df_mixed[year_week_col].astype(str).str.zfill(6) # 解析为ISO周最后一天的日期 df_mixed['ds'] = pd.to_datetime(df_mixed[year_week_col] + '7', format='%G%V%u')
测试验证:输入201501解析结果为2015-01-04,输入201502解析结果为2015-01-11,完全符合需求。
方法2:自定义函数兼容低版本pandas
如果你的pandas版本不支持%G、%V格式符,可以用自定义函数实现:
def get_iso_week_last_day(yw_str): iso_year = int(yw_str[:4]) iso_week = int(yw_str[4:]) # 每年1月4日一定属于当年ISO第1周,以此为基准计算 jan_4th = datetime.datetime(iso_year, 1, 4) # 当年ISO第1周的周一日期 first_week_mon = jan_4th - datetime.timedelta(days=jan_4th.isoweekday() - 1) # 目标周的周一加6天就是周日(周最后一天) target_week_last = first_week_mon + datetime.timedelta(weeks=iso_week -1, days=6) return target_week_last df_mixed['ds'] = df_mixed[year_week_col].astype(str).str.zfill(6).apply(get_iso_week_last_day)
注意事项
- 该逻辑严格遵循ISO 8601周规则:每周从周一开始,周日结束,每年第1周为包含当年第一个周四的周
- 如果你的yyyyww列存储为数值类型,转字符串时可能出现周数前导零丢失的情况,
str.zfill(6)会自动补零到6位,无需额外处理
内容的提问来源于stack exchange,提问作者smrithi
相关产品推荐
相关产品推荐

